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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【数论】GCD(P2568)

發布時間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数论】GCD(P2568) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

P2568


題目大意

求滿足1≤x,y≤n1\leq x,y\leq n1x,yngcd(x,y)=primegcd(x,y)=primegcd(x,y)=prime的數對(x,y)(x,y)(x,y)的個數


解題思路

題目即求

∑i=1n∑j=1n[gcd(i,j)=prime]\sum_{i=1}^n\sum_{j=1}^n[gcd(i,j)=prime]i=1n?j=1n?[gcd(i,j)=prime]

可以考慮先枚舉該prime,那么有

∑p∈primen∑i=1n/p∑j=1n/p[gcd(i,j)=1]∑p∈primen∑i=1n/p∑j=1n/p∑d∣i,d∣jμ(d)∑p∈primen∑d=1n/pμ(d)×?nd?×?nd?\sum_{p\in prime}^n\sum_{i=1}^{n/p}\sum_{j=1}^{n/p}[gcd(i,j)=1]\\ \sum_{p\in prime}^n\sum_{i=1}^{n/p}\sum_{j=1}^{n/p}\sum_{d|i,d|j}\mu(d)\\ \sum_{p\in prime}^n\sum_{d=1}^{n/p}\mu(d)\times \left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor\times \left\lfloor\frac{n}ozvdkddzhkzd\right\rfloor pprimen?i=1n/p?j=1n/p?[gcd(i,j)=1]pprimen?i=1n/p?j=1n/p?di,dj?μ(d)pprimen?d=1n/p?μ(d)×?dn??×?dn??

時間復雜度不太會證,看dalao證的是 O(n/logn)O(n/log n)O(n/logn)


code

#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 10000010 using namespace std; ll n,ans,w,p[N],mu[N],prime[N]; void work() {p[1]=mu[1]=1;for(ll i=2;i<=10000000;++i){if(!p[i]){prime[++w]=i;mu[i]=-1;}for(ll j=1;j<=w&&i*prime[j]<=10000000;++j){p[i*prime[j]]=1;if(i%prime[j]==0){mu[i*prime[j]]=0;break;}else mu[i*prime[j]]=-mu[i];}}for(ll i=2;i<=10000000;++i)mu[i]+=mu[i-1];return; } ll get(ll n) {ll sum=0;for(ll l=1,r=0;l<=n;l=r+1){r=n/(n/l);sum+=(mu[r]-mu[l-1])*(n/l)*(n/l);}return sum; } int main() {scanf("%lld",&n);work();for(ll i=1;i<=w;++i)if(prime[i]<=n)ans+=get(n/prime[i]);else break;printf("%lld",ans);return 0; }

總結

以上是生活随笔為你收集整理的【数论】GCD(P2568)的全部內容,希望文章能夠幫你解決所遇到的問題。

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