地址:http://acm.bit.edu.cn/mod/programming/view.php?id=700
题意:求n的欧拉函数值。。
原理是"φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。"
如12=2^2*3 那么φ(12)=12*(1-1/2)*(1-1/3)
自己写的代码比模板啰嗦很多。要背模板了。。
#include<iostream>
using namespace std;
int prime[10000];
bool judge(int a)
{
if(a%2==0) return 0;
for(int i=3;i*i<=a;i+=2)
{
if(a%i==0) return 0;
}
return 1;
}
int main()
{
int sub=1,i,ans,n;
prime[0]=2;
for(i=3;i<100000;i+=2) //打素数表
{
if(judge(i)) prime[sub++]=i;
}
while(scanf("%d",&n),n)
{
ans=n;
int tn=n;
for(i=0;prime[i]*prime[i]<=tn;i++) //因数分解,根据公式得出答案
{
if(n%prime[i]==0)
{
ans=ans/prime[i]*(prime[i]-1);
while(n%prime[i]==0) n/=prime[i];
}
}
if(n==1) printf("%d\n",ans);
else printf("%d\n",ans/n*(n-1)); //
}
return 0;
}
模板备份:
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long euler(long long n)//求n的欧拉函数
{
long long ans=1,i;
for(i=2;i*i<=n;i++)
if (n%i==0)
{
ans*=i-1; n/=i;
while(n%i==0)
{ ans*=i; n/=i; }
}
if (n>1) ans*=n-1;
return ans;
}
int main()
{
long long n;
while(scanf("%lld",&n),n)
{
printf("%lld\n",euler(n));
}
return 0;
}