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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

UVA 11426 GCD-Extreme(II) ★ (欧拉函数)

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 UVA 11426 GCD-Extreme(II) ★ (欧拉函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意

求Σ{1<=i<N} Σ{i<j<=N} GCD(i, j) ? ? (N<=4000000)

分析

原始思路

暴力求明顯是不行的,我們把式子簡化形式一下發現它可以寫成Σ{2<=j<=N} GCD(1~j-1, j) 這個形式就給我們一種思路:可以只枚舉j,然后快速算出GCD(1~j-1, j) 我們當然不能枚舉1~j-1那么算,那么再換種思路,枚舉可能的答案k,即j的所有約數。分別計算GCD(1~j-1, j) = k的方案數(HDU 1695),然后加起來就能求出和了。 【求GCD(x, j) = k,x ∈ (1, j-1)的個數】我們知道j必須是k的倍數,所以可以在等式兩邊同時除以k變成:GCD(x, j/k) = 1,x ∈ (1, j/k-1)。那么顯然答案等于phi(j/k)。

進一步優化

上面的方法還是超時,我們還需要優化。在求j的約數時會有很多無用狀態,它的過程很像是暴力判斷素數一樣,聯想到篩法求素數,我們也可以想到類似的思路:枚舉k,那么k的倍數就是j,然后再算GCD(1~j-1, j) = k。 ? #include #include #include #include #include #include #define MID(x,y) ((x+y)/2) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; const int MAX = 4000002; int phi[MAX]; bool noprime[MAX]; vector prime; void Euler(int n){phi[1] = 0;for (int i = 2; i <= n; i ++){if (!noprime[i]){prime.push_back(i);phi[i] = i - 1;}for (int j = 0; j < (int)prime.size() && prime[j] * i <= n; j ++){noprime[prime[j]*i] = 1;if (i % prime[j] == 0){phi[prime[j]*i] = phi[i] * prime[j];}else{phi[prime[j]*i] = phi[i] * phi[prime[j]];}}} } long long f[MAX]; int main(){//freopen("test.in", "r", stdin);//freopen("test.out", "w", stdout);Euler(MAX);mem(f, 0);for (int i = 1; i < MAX; i ++){for (int n = i*2; n < MAX; n += i){f[n] += i * phi[n/i];}}int n;while(scanf("%d", &n), n){long long res = 0;for (int i = 2; i <= n; i ++){res += f[i];}printf("%lld\n", res);}return 0; } ?

轉載于:https://www.cnblogs.com/AbandonZHANG/p/4114062.html

總結

以上是生活随笔為你收集整理的UVA 11426 GCD-Extreme(II) ★ (欧拉函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

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