天天看點

51nod 1135 原根

定義:設

51nod 1135 原根

51nod 1135 原根

,使得

51nod 1135 原根

成立的最小的

51nod 1135 原根

,稱為

51nod 1135 原根

對模

51nod 1135 原根

的階,記為

51nod 1135 原根

定理:如果模

51nod 1135 原根

有原根,那麼它一共有

51nod 1135 原根

個原根。

定理:若

51nod 1135 原根

51nod 1135 原根

51nod 1135 原根

,則

51nod 1135 原根

定理:如果

51nod 1135 原根

為素數,那麼素數

51nod 1135 原根

一定存在原根,并且模

51nod 1135 原根

的原根的個數為

51nod 1135 原根

定理:設

51nod 1135 原根

是正整數,

51nod 1135 原根

是整數,若

51nod 1135 原根

51nod 1135 原根

的階等于

51nod 1135 原根

,則稱

51nod 1135 原根

為模

51nod 1135 原根

的一個原根。

   假設一個數

51nod 1135 原根

對于模

51nod 1135 原根

來說是原根,那麼

51nod 1135 原根

的結果兩兩不同,且有

51nod 1135 原根

,那麼

51nod 1135 原根

可以稱為是模

51nod 1135 原根

的一個原根,歸根到底就是

51nod 1135 原根

當且僅當指數為

51nod 1135 原根

的時候成立。(這裡

51nod 1135 原根

是素數)

51nod 1135 原根

有原根的充要條件:

51nod 1135 原根

,其中

51nod 1135 原根

是奇素數。

求模素數

51nod 1135 原根

原根的方法:對

51nod 1135 原根

素因子分解,即

51nod 1135 原根

51nod 1135 原根

的标準分解式,若恒有

51nod 1135 原根

成立,則

51nod 1135 原根

就是

51nod 1135 原根

的原根。(對于合數求原根,隻需把

51nod 1135 原根

換成

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;}
        }
    }
}