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;
    }
  • 相关阅读:
    ES 遇到 unassigned shard如何处理?
    elasticsearch如何安全重启
    Agg学习笔记
    二进制文件中读写结构体
    C语言 结构体数组保存到二进制文件中
    Memcache 笔记
    memcached完全剖析–1. memcached的基础
    Redis和Memcache对比及选择
    Exploring the MapBox stack: MBTiles, TileJSON, UTFGrids and Wax
    Tilemill + tilestream + mapbox.js 自制地图
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/7701075.html
Copyright © 2011-2022 走看看