zoukankan      html  css  js  c++  java
  • [51nod1135]原根

    设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根。(其中φ(m)表示m的欧拉函数)
    给出1个质数P,找出P最小的原根。
    Input
    输入1个质数P(3 <= P <= 10^9)
    Output
    输出P最小的原根。
    Input示例
    3
    Output示例
    2

    有一些结论

    膜$m$有原根的充要条件是$m=1,2,4,p,2p,p^n$,其中$p$是奇质数,$n$是任意正整数

    若膜$m$有原根,那么原根个数为$phileft(phileft(m ight) ight)$

    膜$P$意义下的原根求法

    对$phileft(P ight)$进行质因数分解

    根据唯一分解定理可知一定能分解为$phileft(P ight)=p^{alpha_1}_1*p^{alpha_2}_2*cdots *p^{alpha_n}_n$

    然后从$2$到$P$枚举每一个数

    只要数$g$满足$g^{frac{phileft(P ight)}{p_i}} ot=1(mod P)$

    那么$g$就是膜$P$意义下的一个原根

    #include <iostream>
    using namespace std;
    typedef long long ll;
    inline ll ksm(ll a, ll b, const ll &mod){
        ll s = 1;
        while(b){
            if(b & 1) s = s * a % mod;
            b >>= 1;
            if(b) a = a * a % mod;
        }
        return s;
    }
    int pri[10], cnt = 0;
    int main(){
        ll p, t;
        cin >> p;
        t = p - 1;
        for(int i = 2; i * i <= t; i++){
            if(t % i == 0){
                pri[++cnt] = i;
                while(t % i == 0) t /= i;
            }
        }
        if(t != 1) pri[++cnt] = t;
        bool flag; 
        for(int g = 2; g <= p; g++){
            flag = true;
            for(int j = 1; j <= cnt; j++){
                t = ksm(g, (p - 1) / pri[j], p);
                if(t == 1){
                    flag = false;
                    break;
                }
            }
            if(flag){
                cout << g << endl;
                break;
            }
        }
        return 0;
    }
  • 相关阅读:
    一、反射机制介绍_Class 对象获取
    六、.XPATH 技术_快速获取节点
    五、.DOM4J 方式解析 XML 数据
    四、.JDOM 解析 XML 数据
    三、SAX 方式解析 XML 数据
    二、DOM方式解析XML
    一、Schema验证XML
    三、线程同步Synchronized
    二、线程状态
    JDK8Lambda和方法的引用
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7701075.html
Copyright © 2011-2022 走看看