• poj1284:欧拉函数+原根


    何为原根?
    由费马小定理可知 如果a于p互质 则有a^(p-1)≡1(mod p)
    对于任意的a是不是一定要到p-1次幂才会出现上述情况呢?
    显然不是,当第一次出现a^k≡1(mod p)时, 记为ep(a)=k 当k=(p-1)时,称a是p的原根
    每个素数恰好有f(p-1)个原根(f(x)为欧拉函数)
     
    定理:对于奇素数m, 原根个数为phi(phi(m)), 由于phi(m)=m-1, 所以为phi(m-1)。
    某大牛的证明:

    {xi%p | 1 <= i <= p - 1} = {1,2,...,p-1} 等价于 {xi%(p-1) | 1 <= i <= p - 1} = {0,1,2,...,p-2},即为(p-1)的完全剩余系

    若x,x2...x(p-1)是(p-1)的完全剩余系,

    根据定理,可以推出若gcd(x, p-1) = 1时, (1,x,...,x(p-2))也是(p-1)的完全剩余系

    因为若xi != xj (mod p-1),那么x*xi != x*xj (mod p-1),与条件m矛盾,所以 xi = xj (mod p-1),

    由此可以确定答案为EulerPhi(p-1)

    代码

    #include<stdio.h>
    #define maxn  66666
    int euler[maxn+1];
    int phi(int n)
    {
        int res=n;
        for(int i=2;i*i<=n;i++)
        {
            if(n%i==0)
            {
                res=res-res/i;
                while(n%i==0)
                    n/=i;
            }
        }
        if(n>1)
            res=res-res/n;
        return res;
    }
    //筛法范围打表  nlogn
    void phi()
    {
        for(int i=1;i<=maxn;i++)
            euler[i]=i;
        for(int i=2;i<=maxn;i+=2)
            euler[i]/=2;
        for(int i=3;i<=maxn;i++)
        {
            if(euler[i]==i) //未被筛到。是素数,则用此素数来筛
            {
                for(int j=i;j<=maxn;j+=i)
                {
                    euler[j]=euler[j]/i*(i-1);
                }
            }
        }
        return ;
    }
    int main()
    {
        int n;
        phi();
        while(scanf("%d",&n)!=EOF)
        {
            printf("%d
    ",euler[n-1]);
        }
    }
  • 相关阅读:
    1722 最优乘车 1997年NOI全国竞赛
    5969 [AK]刻录光盘
    tarjan算法讲解
    求有向图的强连通分量个数 之 Kosaraju算法
    信使
    1405 奶牛的旅行
    P1828 香甜的黄油 Sweet Butter
    洛谷P2235 [HNOI2002]Kathy函数
    「BZOJ1010」[HNOI2008] 玩具装箱toy(斜率优化)
    BZOJ 1974 [Sdoi2010] auction 代码拍卖会(数位dp)
  • 原文地址:https://www.cnblogs.com/oneshot/p/3979863.html
Copyright © 2020-2023  润新知