本题思路明确,应该是一道水题;但是却让我WA了1次TIM了1次,郁闷ing;第一次看了一下是欧拉公式我自己现在还是认为可以解决但是却WA了,不找到哪位大牛可以指导下。第二次,就用打表的但是调用了最大公约数超时了;后来想到了素数打表的方法,过了109MS。
下面是WA的欧拉函数算法,希望大牛指点
#include"stdio.h"
int eular(int n)
{
int i,res=1;
for(i=2;i*i<n;i++)
{
if(n%i==0)
{
res*=i-1;
n/=i;
while(n%i==0)
{
res*=i;
n/=i;
}
}
}
if(n>1)
res*=n-1;
return res;
}
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%d\n",eular(m));
}
return 0;
}
这个是AC的代码:
#include"stdio.h"
#include"string.h"
int d[32770];
int main()
{
int t,n,i,j;
scanf("%d",&t);
while(t--)
{
memset(d,0,sizeof(d));
scanf("%d",&n);
for(i=2;i<n;i++)
if(n%i==0&&d[i]==0)
{
for(j=i;j<n;j+=i)
d[j]=1;
}
int count=0;
for(i=1;i<n;i++)
if(d[i]==0)
count++;
printf("%d\n",count);
}
return 0;
}