洛谷P2568 GCD(莫比乌斯反演)
这题和p2257一样……不过是n和m相同而已……
所以虽然正解是欧拉函数然而直接改改就行了所以懒得再码一遍了2333
不过这题卡空间,记得mu开short,vis开bool
1 //minamoto 2 #include<cstdio> 3 #define ll long long 4 const int N=1e7+5; 5 int p[1000005],n,m;short mu[N];bool vis[N];ll sum[N],ans; 6 void init(int n){ 7 mu[1]=1; 8 for(int i=2;i<=n;++i){ 9 if(!vis[i]) mu[i]=-1,p[++m]=i; 10 for(int j=1;j<=m&&p[j]*i<=n;++j){ 11 vis[i*p[j]]=1; 12 if(i%p[j]==0) break; 13 mu[i*p[j]]=-mu[i]; 14 } 15 } 16 for(int j=1;j<=m;++j) 17 for(int i=1;i*p[j]<=n;++i) 18 sum[i*p[j]]+=mu[i]; 19 for(int i=1;i<=n;++i) sum[i]+=sum[i-1]; 20 } 21 int main(){ 22 scanf("%d",&n),init(n); 23 for(int l=1,r;l<=n;l=r+1){ 24 r=n/(n/l); 25 ans+=(sum[r]-sum[l-1])*(n/l)*(n/l); 26 } 27 printf("%lld\n",ans); 28 return 0; 29 }
深深地明白自己的弱小