[SDOI2012]Longge的問題
阿新 • • 發佈:2018-11-07
long www tps sum ++ bit using include geo
[SDOI2012]Longge的問題
BZOJ
luogu
考慮n的每個約數的貢獻
求[1,n]有多少i與gcd(i,n)=k
即求\[\sum_{k|n}k\sum_{i=1}^n[gcd(i,n)=k]\]
\[=\sum_{k|n}k\sum_{i=1}^{\frac{n}{k}}[gcd(i,\frac{n}{k})=1]\]
\[=\sum_{k|n}k\phi(k)\]
由於k|n,所以預處理n的不同質因子,可以做到\(O(logn)\)求\(\phi(k)\)
復雜度:\(O(\sqrt nlogn)\)
#define ll long long #include<bits/stdc++.h> using namespace std; int cnt; ll n,ans,z[100000]; void fact(ll x){ for(int i=2,sq=sqrt(x);i<=sq;i++){ if(x%i==0){ z[++cnt]=i; while(x%i==0)x/=i; } } if(x>1)z[++cnt]=x; } ll getphi(ll x){ ll res=x; for(int i=1;i<=cnt;i++) if(x%z[i]==0){ res/=z[i];res*=z[i]-1; while(x%z[i]==0)x/=z[i]; } if(x>1)res/=x,res*=x-1; return res; } int main(){ cin>>n; fact(n); for(int i=sqrt(n);i>=1;i--) if(n%i==0){ ans+=getphi(n/i)*i; if(i*i^n)ans+=getphi(i)*n/i; } cout<<ans<<endl; return 0; }
[SDOI2012]Longge的問題