pku 2407 Relatives(单独求欧拉函数,模板)
首先要知道 【定理】正整数n(n≥2)可以唯一分解成素数乘积,即:n =p[1]^r1 * p[2] ^r2 * p[3]^r3. *...* p[s]^rs
其次欧拉函数有两个性质,可以用来编程,单独求phi函数:
① Ø(m) = m ( 1- 1/p[1]) ( 1- 1/p[2])…( 1- 1/p[s])
② Ø(p^k) = p^k – p^(k-1) = (p-1)p^k
下面两种方法就是利用这两个性质。
#include <stdio.h>
typedef long long LL;
LL phi(LL n)
{
LL i,sum=n;
for(i=2; i*i<=n; i++)
{
if(n%i==0)
{
sum = sum / i * (i-1);
do
{
n/=i;
}
while(n%i==0);
}
}
if(n>1) sum = sum / n * (n - 1);
return sum;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("tdata.txt","r",stdin);
#endif
LL n;
while(scanf("%I64d",&n),n)
{
printf("%I64d\n",phi(n));
}
return 0;
}
//*******************************************************************
#include <stdio.h>
typedef long long LL;
LL phi(LL n)
{
LL i,sum=1;
for(i=2; i*i<=n; i++)
{
if(n%i==0)
{
sum *= (i-1);
n /= i;
while(n%i==0)
{
sum *= i;
n /= i;
}
}
}
if(n>1) sum *= (n-1);
return sum;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("tdata.txt","r",stdin);
#endif
LL n;
while(scanf("%I64d",&n),n)
{
printf("%I64d\n",phi(n));
}
return 0;
}
浙公网安备 33010602011771号