2182: 不是签到题XD
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 89 Solved: 20
SubmitStatusWeb Board
Description
小明是一个贪心的孩子,他天天想着怎么让自己省钱。有一天他去商店买物品,然而他不是普通人,他有一个马基雅把库内的能力,可以只花掉商品价格与他今日幸运数字x的最大公约数的钱就能买走这个商品。那么问题来了,如果他要买价值从1到x元的x个商品,一共要花掉多少钱。
Input
本题有多组测试数据,每组包含一个整数,代表小明今日的幸运数字x,1<=x<=1e11
Output
对于每组输入,请输出他的花费
每组输出占一行
每组输出占一行
Sample Input
1
2
3
5
2
3
5
Sample Output
1
3
5
9
3
5
9
HINT
Source
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
long long Euler(long long num)
{
long long temp=num;
for(long long i=2;i*i<=num;i++)
if(num%i==0)
{
while(num%i==0)
num=num/i;
temp=temp/i*(i-1);
}
if(num!=1)
temp=temp/num*(num-1);
return temp;
} //欧拉函数,求1--n之间所有与n互质的数的个数
int main()
{
long long n,sum,k;
while(scanf("%lld",&n)!=EOF)
{
sum=0;
for(long long i=1;i*i<=n;i++)
{
if(n%i==0) sum=sum+Euler(n/i)*i;
k=n/i;//循环减半后的处理
if(n%k==0 && k!=i) sum=sum+Euler(n/k)*k;
}
printf("%lld\n",sum);
}
return 0;
}