您的位置:首页 > 其它

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,再乘以倍数,总和相加就是了

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: