您的位置:首页 > 其它

欧拉函数

2015-09-20 09:42 148 查看
题目描述

给定一个数字NN, 输出NN的欧拉函数值。

输入:

输入包含一个正整数NN, 2≤N≤2000000000.2 \le N \le 2\,000\, 000 \, 000.

输出:

输出一个整数,表示NN的欧拉函数值。

样例输入:

6

5

样例输出:

2

4

解题思路

设一个数A=ax11∙ax22∙⋯∙axnn A= a_1^{x_1} \bullet a_2^{x_2} \bullet \cdots \bullet a_n^{x_n}, 那么AA的欧拉函数:

phi(A)=ax1−11∙(a1−1)∙ax2−12∙(a2−1)∙⋯∙axn−1n∙(an−1)phi(A) = a_1^{x_1-1} \bullet (a_1-1) \bullet a_2^{x_2-1} \bullet (a_2-1) \bullet \cdots \bullet a_n^{x_n-1} \qquad \qquad \bullet (a_n-1)

  整理这个公式的时候,不能发现,从这个公司出发很容易地用程序去实现求phi(A)phi(A)的操作。

  具体的做法就是,先令temp=Atemp=A, 然后每找到一个AA的质因子xx,就从temptemp中除掉一个该因子xx,再乘以(x−1)(x-1)。

  通过这道题,可以发现,在做一些数学类问题的时候,往往推出的公式能简化程序。

代码如下:

// Euler.cpp

#include <stdio.h>
#include <stdlib.h>

typedef __int64 int64; //定义__int64的别名为int64

int64 phi(int64 a){ //求a的欧拉函数值,即phi(a)
    int64 temp=a;
    for (int64 i=2;i*i<=a;i++) //寻找a的质因子
    {
        if (a%i == 0)
        {
            while(!(a%i))
                a /= i;
            temp = temp/i * (i-1);
        }
    }
    if(a!=1)
        temp = temp/a * (a-1);

    return temp;
}

void main()
{
    int64 a;
    while(scanf("%I64d",&a)!=EOF)
        printf("%I64d\n",phi(a)); //__int64的格式化输出

}


效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: