码迷,mamicode.com
首页 > 其他好文 > 详细

math2407_Euler's function

时间:2014-10-09 22:37:39      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   os   for   sp   2014   on   

定义:    对于正整数n,φ(n)是小于或等于n的正整数中,与n互质(互质意思为两者公约数只有一个1)的数的数目;

                例如: φ(8) = 4, 因为1,3,5,7均和8互质。

性质:  1.    若p是质数,φ(p)= p-1.

        2.    若n是质数p的k次幂,φ(n)= (p-1)p^(k-1)

n=p*p*p*p...(共K个P),P是质数,P不能被再次分解成更小的数,因此n只能被这么拆分,因此只能与p的倍数互质,这样的数可以表示成t*p,其中t=1,2,3....pk-1-1,即共有pk-1-1个与n互质,因此φ(n)=φ(p^k)=p^k-1-(pk-1-1)=(p-1)p^(k-1)

        3.    欧拉函数是积性函数,若m,n互质,φ(mn)= φ(m)φ(n)

 

        根据这3条性质我们就可以退出一个整数的欧拉函数的公式,因为一个数总可以一些质数的乘积的形式,

 bubuko.com,布布扣bubuko.com,布布扣

公式:

φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有不重复的因数,x是不为0的整数。

 

#include <iostream>

#include <cstdio>

#include <cstring>

using namespace std;

//Accepted 164K 0MS C++ 472B

int work(int n) {

    int rea = n;

    for(int i = 2; i*i<=n; i++) {

        if(n%i == 0) {//I可以是因数

            rea = rea - rea/i;///取x(1-1/p1)=x-x/p1

            while(n%i==0) { n /= i; }//i的N次方有可能也是n的因数

        }

    }

    if(n>1) { rea = rea - rea/n ;}  //防止除完还有一个因数,比如42,除以2得到21,再除以3,得到7,然后i不会再遍历到7,因为7大于根号42。因此最后一步还要处理一下

    return rea;

}

 

int main()

{

    int n;

    while(scanf("%d", &n) && n) {

        int res = work(n);

        printf("%d\n", res);

    }

    return 0;

}

 

math2407_Euler's function

标签:style   blog   http   io   os   for   sp   2014   on   

原文地址:http://www.cnblogs.com/notlate/p/4014258.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!