[POJ2407]欧拉函数的值

来源:互联网 发布:java写的程序怎么运行 编辑:程序博客网 时间:2024/05/23 02:00

原题

题目描述

给定整数n,求n的欧拉函数的值

输入

多组数据
每行一个整数,表示n( 1 <= n <= 1,000,000,000)
一个0,表示输入结束

输出

每行输入一个整数,表示对应的n的欧拉函数值

样例输入

7
12
0

样例输出

6
4

分析

要解决这道题,我们先来了解什么是欧拉函数和欧拉定理。

欧拉函数φ:不超过n的且与n互质的正整数的个数。
如果n为素数p,则φ(p)=p1
如果n为素数p的幂次pa,则φ(pa)=(p1)pa1.
欧拉函数为积性函数:如果n为任意两个互质的数a、b的积,则φ(n)=φ(a)φ(b)

n=p1a1p2a2pkak
φ(n)=n(11/p1)(11/p2)(11/pk)

欧拉定理:
若a与m互质,则aφ(m)1(mod m)

所以,我们就得出了欧拉计算函数。

int euler(int n){    int m=int(sqrt(n+0.5)),ans=n;    for(int i=2;i<=m;i++)        if(n%i==0){            ans=ans/i*(i-1);            while(n%i==0) n/=i;        }    if(n>1) ans=ans/n*(n-1);    return ans;}

源代码

#include<iostream>#include<cstdio>#include<cmath>using namespace std;int euler(int n){    int m=int(sqrt(n+0.5)),ans=n;    for(int i=2;i<=m;i++)        if(n%i==0){            ans=ans/i*(i-1);            while(n%i==0) n/=i;        }    if(n>1) ans=ans/n*(n-1);    return ans;}int main(){    int x;    while(scanf("%d",&x)&&x)        printf("%d\n",euler(x));}
0 0