Sum
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
-
给你一个数N,使得在1~N之间能够找到x使得x满足gcd( x , N ) >= M,
求解gcd(x,N)的和
- 输入
- 多组测试数据
每行输出两个数N,M(N,M不超int) 输出 - 输出sum 样例输入
-
5 3
样例输出 -
5
-
详细题解看我上一篇,题目稍微变了点。求所有GCD的和,重复的也算进去。 还有N,M 超int,醉了。。。
-
#include <cstdio> #include <cstring> #include <algorithm> #define LL long long using namespace std; LL euler(LL n) { LL i; LL eu = n; for(i = 2; i*i <= n; i++) { if(n % i == 0) { eu = eu * (i-1) / i; while(n % i == 0) n /= i; } } if(n > 1) eu = eu * (n-1) / n; return eu; } int main() { LL n, m; LL i; LL ans; while(scanf("%lld%lld", &n, &m) != EOF) { ans = 0; for(i = 1; i*i <= n; i++)//遍历所有可能的 i { if(n % i)//不能整除 continue; /*只处理n % i == 0 的 i */ if(i >= m) ans += i*euler(n/i);//大于或者等于m GCD i乘上对应的n/i的欧拉函数 if(n/i >= m && i*i != n) ans += n*euler(i)/i; } printf("%lld\n", ans); } return 0; }
- 多组测试数据