杂题选讲 3 公约数的和

T1
T2
这是一个大水题big water
我们设
f[k]表示gcd(i,j)=k的个数,
g[k]表示k | gcd(i,j) 的个数。
显然g[k]=f[k]+f[2k]+f[3k]+....+f[mk].
又因为g[k]=(k/n)^2. (i,j因为都要是k的倍数,所以各有k/n种选择,根据乘法原理可得)
于是就有所以f[k]=g[k]-(f[2k]+f[3k]+....+f[mk]).
所以就结束了
下面给出T2题解,就2行
T1 输出改为ans就行

#include<iostream>
using namespace std;long long n,ans,f[100000005];int main(){cin>>n;for(int i=n;i>=1;i--){f[i]=n/i*(n/i);for(int j=i*2;j<=n;j+=i) f[i]-=f[j];ans+=f[i]*i;}cout<<(ans-(n+1)*n/2)/2;}
posted @ 2021-04-16 20:18  S_Curry  阅读(44)  评论(2编辑  收藏  举报