题目:
http://www.lydsy.com/JudgeOnline/problem.php?id=2705
题解:
求Σgcd(i,n)
因为gcd(i,n)一定是n的约数
所以我们枚举n的约数,对于每个约数d,他的贡献是d*φ(n/d)
所以暴力枚举约数,然后暴力求欧拉即可
#include<cstdio> typedef long long ll; using namespace std; ll n,ans; ll oula(ll n) { ll ans=n,a=n; for(ll i=2;i*i<=n;i++) if(a%i==0) { ans-=ans/i; while(a%i==0) a/=i; } if(a>1) ans-=ans/a; return ans; } int main() { scanf("%lld",&n); for (int i=1;i*i<=n;i++) if (n%i==0) { ans+=oula(n/i)*i; if (i*i!=n) ans+=oula(i)*n/i; } printf("%lld ",ans); return 0; }