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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

BZOJ 2818——Gcd

發布時間:2023/11/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ 2818——Gcd 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給定n,求gcd(x,y)==p 的對數,其中(1<=x<y<n)


思路:

求(x, y) = k, 1 <= x, y <= n的對數等于求(x, y) = 1, 1 <= x, y <= n/k的對數!所以,枚舉每個質數p(線性篩素數的方法見:線性時間內篩素數和歐拉函數),然后求(x, y) = 1, 1 <= x, y <= n/p的個數。

那(x, y) = 1的個數如何求呢?其實就是求互質的數的個數。在[1, y]和y互質的數有phi(y)個,如果我們令x < y,那么答案就是sigma(phi(y))。因為x, y是等價的,所以答案*2,又因為(1, 1)只有一對,所以-1。最終答案為sigma(sigma(phi(n/prime[i])) * 2 - 1)。

參考:https://oi.abcdabcd987.com/eight-gcd-problems/


code:

#include <cstdio> #include <iostream> #include <algorithm> #include <set> #include <cmath> #include <vector> using namespace std; using namespace std; typedef long long ll; const int N = 10000005; const ll maxn=1e18+100; int n,len; int p[N],phi[N]; bool vis[N];int main() {scanf("%d",&n);len=0;for (int i=2;i<=n;i++){if (!vis[i]){p[len++]=i;phi[i]=i-1;}for (int j=0;j<len&&i*p[j]<=n;j++){vis[i*p[j]]=1;if (i%p[j]) phi[i*p[j]]=phi[i]*(p[j]-1);else{phi[i*p[j]] = phi[i] * p[j];break; }}}phi[1]=1;for (int i=2;i<=n;i++) phi[i]+=phi[i-1];ll ans=0;for (int i=0;i<len;i++) ans+=phi[n/p[i]]*2-1;printf("%lld",ans); }


總結

以上是生活随笔為你收集整理的BZOJ 2818——Gcd的全部內容,希望文章能夠幫你解決所遇到的問題。

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