51nod–1136 欧拉函数

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为Euler’s totient function、φ函数、欧拉商数等。例如:φ(8) = 4(Phi(8) = 4),因为1,3,5,7均和8互质。
Input
输入一个数N。(2 <= N <= 10^9)
Output
输出Phi(n)。
Input示例
8
Output示例
4

/* 根据唯一分解定理:任意正整数都可以唯一的表示为多个素数的幂相乘 解题思路:根据公式&(n) = n*(1-1/p1)...(1-1/pk) 其中pi代表就是那**素因子**,记住这个公式吧,之前是根据容斥定理得到的 */
code:
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(euler_phi(n));
    }
    public static int euler_phi(int n ){
        int m = (int) Math.sqrt(n+0.5);
        int ans =n;
        for(int i=2; i<=m; ++i)
            if(n%i == 0){ //第一个一定是素因子
            //为什么呢?首先能取模为0,表示是因子,
            //其次这里的i相当于是p,是根据唯一分解定理来
            //说,都是素数
                ans = ans / i * (i-1);
                //while是将指数弄到0
                while(n % i == 0)
                    n /= i;
            }
        if(n > 1)
            ans = ans / n * (n-1);
        return ans;
    }
}