日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 6428 Problem C. Calculate(积性函数)

發布時間:2023/12/4 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 6428 Problem C. Calculate(积性函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Problem C. Calculate

?=???=??μ?I?(n)=∑d∣n(??μ)(d)設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)\\ 設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)=dn?(??μ)(d)g(n)=dn?(??μ)(d)i=1A?j=1B?k=1C??(gcd(i,j2,k3))i=1A?j=1B?k=1C?di,dj2,dk3?(??μ)(d)d=1A?(??μ)(d)i=1A?j=1B?k=1C?[di,dj2,dk3]
x=∏pikix = \prod p_i ^{k_i}x=piki??,唯一分解,如果x∣ytx \mid y ^ txyt,則有∏pi?kit?∣y\prod p_i ^{\lceil \frac{k_i}{t} \rceil} \mid ypi?tki????y,設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 \fracozvdkddzhkzd{f_1(d)} \rfloor \lfloor \fracozvdkddzhkzd{f_2(d)} \rfloor \lfloor \fracozvdkddzhkzd{f_3(d)} \rfloor d=1A?(??μ)(d)?f1?(d)d???f2?(d)d???f3?(d)d??

對于h=(??μ)(d),f1,f2,f3h = (\phi * \mu)(d), f_1, f_2, f_3h=(??μ)(d),f1?,f2?,f3?都具有積性,所以可以線性篩預處理,最后O(A)O(A)O(A)統計答案。

#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; }

總結

以上是生活随笔為你收集整理的HDU 6428 Problem C. Calculate(积性函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。