51nod 1040 最大公约数之和(欧拉)
2017-03-23 18:38
381 查看
连接
1040 最大公约数之和
题目来源: rihkddd
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15
根据题意我们要把每个数与n 的最大公约数求出来是不可能的,先找出n的所有因数,既然是n的最大公约数,那么他们之间肯定有共同的因子,而与n 的因子互质的数他们的最大公约数就是该因子m,再乘以倍数,总和相加就是了
1040 最大公约数之和
题目来源: rihkddd
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15
根据题意我们要把每个数与n 的最大公约数求出来是不可能的,先找出n的所有因数,既然是n的最大公约数,那么他们之间肯定有共同的因子,而与n 的因子互质的数他们的最大公约数就是该因子m,再乘以倍数,总和相加就是了
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; #define M 1000010 #define LL long long int vis[M], q[10010]; LL n; LL geteu(LL m) { LL eu = m; for(int i=2; i*i<=m; i++) { if(m % i == 0) { eu = eu * (i - 1) / i; while(m % i == 0) { m /= i; } } } if(m > 1) { eu = eu * (m-1) / m; } return eu; } int main() { while(scanf("%lld", &n) != EOF) { LL ans = 0; LL i; for(i=1; i*i<n; i++) { if(n % i) { continue; } LL t = n / i; ans += i * geteu(t); ans += t * geteu(i); } if(i*i == n) { ans += i * geteu(i); } printf("%lld\n", ans); } return 0; }
相关文章推荐
- 51nod 1040 最大公约数之和(欧拉函数)
- 51nod 1040 最大公约数之和
- 51nod 1040 最大公约数之和
- 51nod 1040 最大公约数之和 | 数论
- 51Nod-1040-最大公约数之和
- 51nod 1040 最大公约数之和(欧拉函数)
- [51nod]1040 最大公约数之和
- 【51Nod 1040】 最大公约数之和
- 51Nod 1040 最大公约数之和
- 51nod-1040 最大公约数之和
- 51nod-1040-最大公约数之和(欧拉函数)
- 51nod 1040 最大公约数之和
- 51nod 1040:最大公约数之和(数论)
- 51NOD 1040 最大公约数之和(欧拉函数 + 转化)
- [数论] 51Nod 1040 最大公约数之和
- 51nod 1040 最大公约数之和 (数学)
- [51nod] 1040 最大公约数之和
- 51NOD 1040 1040 最大公约数之和 数论 欧拉函数
- 【51nod】1040 最大公约数之和 欧拉函数
- 51nod 1040 最大公约数之和 欧拉函数