HDU 6428 Problem C. Calculate(积性函数)
Problem C. Calculate
?=???=??μ?I?(n)=∑d∣n(??μ)(d)設(shè)g(n)=∑d∣n(??μ)(d)∑i=1A∑j=1B∑k=1C?(gcd(i,j2,k3))∑i=1A∑j=1B∑k=1C∑d∣i,d∣j2,d∣k3(??μ)(d)∑d=1A(??μ)(d)∑i=1A∑j=1B∑k=1C[d∣i,d∣j2,d∣k3]\phi = \phi * \epsilon = \phi * \mu * I\\ \phi(n) = \sum_{d \mid n} (\phi*\mu)(d)\\ 設(shè)g(n) = \sum_{d \mid n}(\phi * \mu)(d)\\ \sum_{i = 1} ^{A} \sum_{j = 1} ^{B} \sum_{k = 1} ^{C} \phi(gcd(i, j ^ 2, k ^ 3))\\ \sum_{i = 1} ^{A} \sum_{j = 1} ^{B} \sum_{k = 1} ^{C} \sum_{d \mid i, d \mid j ^ 2, d \mid k ^ 3} (\phi *\mu)(d)\\ \sum_{d = 1} ^{A} (\phi *\mu)(d) \sum_{i = 1} ^{A} \sum_{j = 1} ^{B} \sum_{k = 1} ^{C}[d \mid i, d \mid j ^ 2, d \mid k ^ 3]\\ ?=???=??μ?I?(n)=d∣n∑?(??μ)(d)設(shè)g(n)=d∣n∑?(??μ)(d)i=1∑A?j=1∑B?k=1∑C??(gcd(i,j2,k3))i=1∑A?j=1∑B?k=1∑C?d∣i,d∣j2,d∣k3∑?(??μ)(d)d=1∑A?(??μ)(d)i=1∑A?j=1∑B?k=1∑C?[d∣i,d∣j2,d∣k3]
設(shè)x=∏pikix = \prod p_i ^{k_i}x=∏piki??,唯一分解,如果x∣ytx \mid y ^ tx∣yt,則有∏pi?kit?∣y\prod p_i ^{\lceil \frac{k_i}{t} \rceil} \mid y∏pi?tki????∣y,設(shè)ft(n)=∏pjkjtf_t(n) = \prod p_j ^ \frac{k_j}{t}ft?(n)=∏pjtkj???。
上式可得:
∑d=1A(??μ)(d)?df1(d)??df2(d)??df3(d)?\sum_{d = 1} ^{A}(\phi * \mu)(d) \lfloor \fracze8trgl8bvbq{f_1(d)} \rfloor \lfloor \fracze8trgl8bvbq{f_2(d)} \rfloor \lfloor \fracze8trgl8bvbq{f_3(d)} \rfloor d=1∑A?(??μ)(d)?f1?(d)d???f2?(d)d???f3?(d)d??
對(duì)于h=(??μ)(d),f1,f2,f3h = (\phi * \mu)(d), f_1, f_2, f_3h=(??μ)(d),f1?,f2?,f3?都具有積性,所以可以線性篩預(yù)處理,最后O(A)O(A)O(A)統(tǒng)計(jì)答案。
#include <bits/stdc++.h>using namespace std;typedef unsigned uint;const int N = 1e7 + 10;uint prime[N], h[N], f1[N], f2[N], f3[N], num[N], primes[N], cnt;bool st[N];void init() {h[1] = f1[1] = f2[1] = f3[1] = primes[1] = 1;for (int i = 2; i < N; i++) {if (!st[i]) {prime[++cnt] = i;h[i] = i - 2;f1[i] = i;f2[i] = i;f3[i] = i;primes[i] = i;num[i] = 1;}for (int j = 1; j <= cnt && 1ll * i * prime[j] < N; j++) {st[i * prime[j]] = 1;if (i % prime[j] == 0) {primes[i * prime[j]] = primes[i] * prime[j];num[i * prime[j]] = num[i] + 1;f1[i * prime[j]] = f1[i] * prime[j];f2[i * prime[j]] = f2[i / prime[j]] * prime[j];if (i / prime[j] % prime[j] == 0) {f3[i * prime[j]] = f3[i / prime[j] / prime[j]] * prime[j];}else {f3[i * prime[j]] = f3[i];}if(i * prime[j] == primes[i * prime[j]]) {h[i * prime[j]] = i * prime[j] - 2 * i + i / prime[j];}else {h[i * prime[j]] = h[i / primes[i]] * h[primes[i * prime[j]]];}break;}h[i * prime[j]] = h[i] * h[prime[j]];f1[i * prime[j]] = f1[i] * f1[prime[j]];f2[i * prime[j]] = f2[i] * f2[prime[j]];f3[i * prime[j]] = f3[i] * f3[prime[j]];primes[i * prime[j]] = prime[j];num[i * prime[j]] = 1;}} }int main() {// freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);// ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);init();int T;scanf("%d", &T);while (T--) {uint A, B, C, ans = 0;scanf("%u %u %u", &A, &B, &C);for (int d = 1; d <= (int)A; d++) {ans += h[d] * (A / f1[d]) * (B / f2[d]) * (C / f3[d]);}printf("%u\n", ans & ((1 << 30) - 1));}return 0; }總結(jié)
以上是生活随笔為你收集整理的HDU 6428 Problem C. Calculate(积性函数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零开始的 Rust 语言 blas 库
- 下一篇: C. Goodbye Souvenir(