欧拉函数求和
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
题目描述很简单,求出
(PS:上面式子的意思是大于0小于n并且能整除n的所有d的欧拉函数值之和)。
-
输入
- 每行一个数n(n<2^31),输入以文件结尾结束。 输出
- 每个结果占一行。 样例输入
-
1 2 12
样例输出
-
0 1 8
//典型欧拉函数
//#include <bits/stdc++.h>
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <queue>
#include <stack>
using namespace std;
int euler(int n){
int ans=n;
for(int i=2;i*i<=n;i++)
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0)
n/=i;
}
if(n>1)
ans=ans/n*(n-1);
return ans;
}
int main()
{
int n,sum;
while(~scanf("%d",&n)){
sum=0;
for(int i=1;i<n;i++){
if(n%i==0){
sum+=euler(i);
}
}
printf("%d\n",sum);
}
return 0;
}