51nod 1135 原根

定义:,使得成立的最小的,称为对模的阶,记为

定理:如果模有原根,那么它一共有个原根。

定理:,则

定理:如果为素数,那么素数一定存在原根,并且模的原根的个数为

定理:是正整数,是整数,若的阶等于,则称为模的一个原根。

假设一个数对于模来说是原根,那么的结果两两不同,且有,那么可以称为是模的一个原根,归根到底就是当且仅当指数为的时候成立。(这里是素数)

有原根的充要条件:,其中是奇素数。

求模素数原根的方法:素因子分解,即的标准分解式,若恒有

成立,则就是的原根。(对于合数求原根,只需把换成即可)

#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
long long d[1000];
long long dp[1000];
int kuai(long long x,long long n,long long m)
{
    long long i,j;
    long long s=1;
    for(i=0;;i++)
    {

        long long t=x;
        long long d=n%2;n=n/2;
        if(d==0) t=1;
        if(d!=0)
        {
            if(i==0) t=t*1%m;
            else
            {
                for(j=0;j<i;j++)
                t=t*t%m;
            }
        }
        s=s*t%m; if(n==0) break;
    }
    return s;
}
int main()
{
    long long p;
    while(cin>>p)
    {
        long long k=p-1;
        long long i;
        long long x=1;
        d[0]=k;
        d[1]=1;
        if(k%2==0)
        {
            d[2]=2;
            while(k%2==0) k=k/2;
        }
        long long l=3;
        for(long long j=3;j<=k;j+=2)
        {
            if(k%j==0)
            {
                d[l]=j;l++;
                while(k%j==0) k=k/j;
               //cout<<j<<endl;
            }
        }

        for(i=2;i<=p;i++)
        {
            long long z=1;
            for(long long j=2;j<l;j++)
            {
                long long t=(p-1)/d[j];

                long long r=kuai(i,t,p);
                //cout<<r<<' '<<t<<' '<<d[j]<<' '<<i<<endl;
                if(r==1) {z=0;break;}

            }

            if(z==1) {cout<<i<<endl;break;}
        }
    }
}
时间: 2024-12-31 03:44:39

51nod 1135 原根的相关文章

(数论)51NOD 1135 原根

设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解:使用快速幂的时候小心int爆了. 1 #include <stdio.h> 2 #include <math.h> 3 4 #define CLR(x) memset(x,0,sizeof x

1135 原根

1135 原根 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 设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这竟然是基础题,(让我死会儿),第一次看题目,一脸懵逼,完全不懂题目讲什么,然后百度一下词条,发现有规律可寻,于是

求最小原根 51nod 1135

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135 代码 // the smallest primitive root of prime P #include <bits/stdc++.h> const long long mod = 1e9+7; const double ex = 1e-10; #define inf 0x3f3f3f3f using namespace std; long long N; i

欧拉函数定义-性质-应用(费马小定理)

典型例题:51nod  1135  原根 设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 欧拉公式:含义:欧拉函数就是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) 通式: 其中p1, p2--pn为x的所有质因数,x是不为0的整数 φ

51Nod 1135-原根(快速求解一个素数的原根)

题目地址:51Nod 1135 1.原根定义:设m>1,gcd(a,m)=1,使得成立的最小的r,称为a对模m的阶. 2.定理:如果模m有原根,那么他一共有个原根. 3.定理:如果p为素数,那么素数p一定存在原根,并且模p的原根的个数为个. 4.定理:假设m是正整数,a是整数,如果a模m的阶等于,则称a为模m的一个原根. 5.模m有原根的充要条件:m=2,4,P^a,2*P^a--. 求模素数P的原根的方法:对P-1素因子分解,即P-1=(P1^a1)(P2^a2)-..(Pk^ak).,若恒有

原根(扩展欧几里得+欧拉函数)

1135 原根 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 设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 转载请注明出处:寻找&星空の孩子 题目链接:http://www.51nod.com/onlineJudge/que

51nod1135(求最小原根)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1135 题意:中文题诶- 思路:设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数)给出1个质数P,找出P最小的原根. 我们先了解一下阶的概念:满足 a^r Ξ (1 mod m) ---1 的最小 r 即为 a%m的阶,我们可以直接从小到大枚举a, 然后将 r= φ(m) 带入进去, 判断如果满足  1式

51nod 1172 Partial Sums V2

题目 给出一个数组A,经过一次处理,生成一个数组S,数组S中的每个值相当于数组A的累加,比如:A = {1 3 5 6} => S = {1 4 9 15}.如果对生成的数组S再进行一次累加操作,{1 4 9 15} => {1 5 14 29},现在给出数组A,问进行K次操作后的结果.(输出结果 Mod 10^9 + 7) 分析 发现,每次处理相当于将A卷上一个\(I(\forall a_i=1)\) 于是机智的我在wiki又发现狄利克雷卷积满足交换律(我居然才知道) 于是快速幂咯,时间复杂

快速求原根

当需要求质数\(P\)的原根\(G\),只需枚举\(a \in [2,P - 1]\),检验对\(P - 1\)的所有质因子\(p_i\),\(a^{\frac{P - 1}{p_I}} \mod P\)是否等于\(0\),若都不等于\(0\),则\(a\)为\(P\)的原根 51Nod原根 #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include&l