SGU102 Coprimes
题目大意:
描述
对于给定的N(1<=N<=10000),求不大于N并与N互质的正整数的个数。 我们把这样的两个正整数称为是互质的:当且仅当它们的最大公约数为1。
输入
输入文件只有一行,整数N。
输出
输出相应的答案。
输入样例
9
输出样例
6
题目意思很好理解。
显然是一道求解欧拉函数的题目。
欧拉函数——φ(n)=不大于n并与n互质的正整数的个数
通项公式:φ(n)=n*(1-1/p1)*(1-1/p2)*(1-1/p3)*(1-1/p4)…...(1-1/pm)
其中p1,p2,p3......pm为小于n且整除n的质数。
有关质数表的打印,可以使用欧拉筛法求解(参看贾志鹏线性筛)
时间复杂度O(n),可以在0.25s内过。
以下附上我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int check[10001];
int prime[10001];
int total,ans;
int n;
void eular() //欧拉筛法求解素数表
{
int i,j;
for (i=2;i<=n;i++)
{
if (!check[i])
prime[total++]=i;
for (j=0;j<total;j++)
{
if (i*prime[j]>n)
break;
check[i*prime[j]]=1;
if (i%prime[j]==0)
break;
}
}
return ;
}
void init()
{
int i;
scanf("%d",&n);
ans=n;
eular();
for (i=0;i<total;i++) //通项公式求解欧拉函数
if (n%prime[i]==0)
ans=ans*(prime[i]-1)/prime[i];
printf("%d",ans);
return ;
}
int main()
{
init();
return 0;
}