(小于等于1的正整数中唯一和1互质的数就是1本身)。
若n是质数p的k次幂,,因为除了p的倍数外,其他数都跟n互质。
欧拉函数是积性函数,即是说若m,n互质,。
例如
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;
/*
* 筛法+欧拉函数
* */
#define MAX_PRIME 10000
#define MAX_PRIME_LEN 5000
int P[MAX_PRIME_LEN]; //prime array
bool vis[MAX_PRIME+10];
int tot;
/* 筛法求素数表 */
void getprime()
{
tot = 0;
memset(vis,false,sizeof(vis));
for(int i=2;i<=MAX_PRIME;i++)
if(!vis[i])
{
P[tot++] = i;
for(int j=i*i;j<=MAX_PRIME;j+=i)
vis[j] = true;
}
return;
}
/* 欧拉函数 */
int euler(int N)
{
int res = N;
for(int i=0;i<tot && P[i]*P[i]<=N;i++)
if(N%P[i]==0)
{
res = res/P[i]*(P[i]-1);
/*
* 设Ki为原数中包含P[i]这个因数的幂次数,
* 则有N = P1^K1*P2^K2*...*Pn*Kn,
* 每找到一个因数P[i],res/P[i]就可以可以得到P[i]^(Ki-1)
* 将所有的找到的因数所得的结果合在一起,则可以得到
* P1^(k1-1)*P2^(K2-1)*...*Pn^(Pn-1)。
* 又每次都乘以了P[i]-1,则可以依据公式得到最终结果。
* */
while(N%P[i]==0) N /= P[i];
}
if(N>1) res = res/N*(N-1); //剩余的是一个大素数。
return res;
}
int main()
{
getprime();
int N;
scanf("%d",&N);
printf("%d\n",euler(N));
return 0;
}