soj 1085. Longge's problem

来源:互联网 发布:淘宝官方短链接 编辑:程序博客网 时间:2024/06/05 08:36

题意:

求 ∑gcd(i, N) 1<=i <=N(1<N<2^31)

思路:

枚举N的所有因子d,与N的gcd为d的数有Eular(N/d)个。

于是gcd(i, N) 1<=i <=N就等于Eular(N/d),d|N。

代码:

#include <cstdio>typedef long long LL;LL n, ans;LL Eular(LL x){LL ret = x;for (LL i = 2; i*i <= x; ++ i){if (x % i == 0){while (x % i == 0) x /= i;ret = ret/i*(i-1);}}if (x != 1) ret = ret/x*(x-1);return ret;}int main(){while (~scanf("%lld", &n)){ans = 0;LL i = 1;for (i = 1; i*i < n; ++ i){if (n % i == 0){ans += i*Eular(n/i);ans += n/i*Eular(i);}}if (i*i == n) ans += i*Eular(i);printf("%lld\n", ans);}}


原创粉丝点击