1136 欧拉函数
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler’s totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。
Input
输入一个数N。(2 <= N <= 10^9)
Output
输出Phi(n)。
Input示例
8
Output示例
4
推荐大神博客在此
欧拉函数的实现是有一个公式的, euler[n] = m表示有 m 个数与 n 互质;对于 n ,倘若有 a1 , a2 , a3 , …. 是 n 的质因子,那么 euler[n] = n * ( 1 - 1/ a1) * (1-1/a2) * (1-1/a3) * …
这个如果用euler解要用 long long
#include <cstdio>
#include <cstring>
#define M 100
#define N 100010
#define LL long long
int main()
{
LL n, eu;
while(scanf("%lld", &n) != EOF)
{
eu = n;
for(LL i=2; i*i<=n; i++)
{
if(n % i == 0)
{
eu = eu * (i - 1) / i;
}
while(n % i == 0)
{
n /= i;
}
}
if(n > 1)
{
eu = eu * (n - 1) / n;
}
printf("%lld\n", eu);
}
return 0;
}
下面是容斥定理解的
#include <cstdio>
#include <cstring>
#define M 100
#define N 100010
int pf[M], k;
int findpf(int n)
{
k = 0;
for(int i=2; i*i<=n; i++)
{
if(n % i == 0)
{
pf[k++] = i;
while(n % i == 0)
{
n /= i;
}
}
}
if(n > 1)
{
pf[k++] = n;
}
}
void getcp(int m)
{
int que[N], top = 0, t;
que[top++] = -1;
for(int i=0; i<k; i++)
{
t = top;
for(int j=0; j<t; j++)
{
que[top++] = que[j] * pf[i] * (-1);//重复的就是乘了偶数次,
//所以在偶数次的时候要变成负号
}
}
int ans = 0;
for(int i=1; i<top; i++)
{
ans += (m / que[i]);
}
printf("%d\n", m - ans);
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
findpf(n);
getcp(n);
}
return 0;
}