欧拉 函数

来源:互联网 发布:mac 打开多个终端 编辑:程序博客网 时间:2024/06/06 19:16
新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,那么该会员的号码肯定和N有大于1的公约数,否则都是新朋友,现在会长想知道究竟有几个新朋友?请你编程序帮会长计算出来。
 
Input
第一行是测试数据的组数CN(Case number,1<CN<10000),接着有CN行正整数N(1<n<32768),表示会员人数。
 
Output
对于每一个N,输出一行新朋友的人数,这样共有CN行输出。
 
Sample Input
22560824027
 
Sample Output
768016016
 
Author
SmallBeer(CML)
 
Source
杭电ACM集训队训练赛(VII)
 
Recommend
#include <iostream>
#include <stdio.h>
using namespace std;
int Euler(int x)// 求 欧拉函数值 其实就是通式的应用
{
    int i,res = x;
    for(i = 2;i*i<=x;i++)  // 
    {
        if(x%i==0)
            res = res/i*(i-1);
        while(x%i==0)  //保证遍历的一定是质因子
            x=x/i;
    }
    if(x>1)
        res = res / x*(x-1);// x 若为1,则所有质因子全部遍历,不为1 则表示最后一个质因子残余,继续res / x*(x-1)
    return res;
}
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        cout<<Euler(n)<<endl;
    }
    return 0;
}
普通的 最大公约数超时
欧拉函数
判别
证明
欧拉函数:在数论中,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目。


先给出一个结论:


 设P是素数,


 若p是x的约数,则E(x*p)=E(x)*p.


 若p不是x的约数,则E(x*p)=E(x)*E(p)=E(x)*(p-1).


证明如下:


E(x)表示比x小的且与x互质的正整数的个数。
*若p是素数,E(p)=p-1。
*E(p^k)=p^k-p^(k-1)=(p-1)*P^(k-1)
证:令n=p^k,小于n的正整数数共有n-1即(p^k-1)个,其中与p不质的数共[p^(k-1)-1]个(分别为1*p,2*p,3*p...p(p^(k-1)-1))。
所以E(p^k)=(p^k-1)-(p^(k-1)-1)=p^k-p^(k-1).得证。
*若ab互质,则E(a*b)=E(a)*E(b),欧拉函数是积性函数.
*对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
则E(n)=E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an)     
      =(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)
      =(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)
      =n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)
* E(p^k)    =(p-1)*p^(k-1)=(p-1)*p^(k-2)*p
  E(p^(k-1))=(p-1)*p^(k-2)
->当k>1时,E(p^k)=E(p*p^(k-1))=E(p^(k-1))*p.
  (当k=1时,E(p)=p-1.)
由上式: 设P是素数,
  若p是x的约数,则E(x*p)=E(x)*p.
  若p不是x的约数,则E(x*p)=E(x)*E(p)=E(x)*(p-1).   证明结束。
0 0
原创粉丝点击