1492: 费马定理 (快速幂)

1492: 费马定理

http://www.acmore.net/problem.php?id=1492

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 82   Solved: 14

Description

 

以数学家命名的定理有很多,其中费马定理就是其中之一,费马定理表明如果一个素数p不能整除整数a那么a^(p-1)%p=1恒成立。试验可知p-1并不一定是该式成立的最小指数,那么你能找出最小的指数x满足a^x%p=1吗?

 

 

Input

 

若干组测试数据,每组数据占一行共两个整数a(1<=a<=10^9),p(2<=p<=10^9),p是素数且不能整除a。

 

 

Output

 

输出最小的x使得a^x%p=1成立。

 

 

Sample Input

 

5 11 6 11

 

Sample Output

 

5 10

 

HINT

 

 

 

Source

 

Lyush

 

 

数学题,由于已经告知费马定理的存在,那么可以证明最小的满足要求的x一定是p-1的因子。可以假设如果x不是p-1的因子的话,那么令p-1=k*x+r,那么有a^(k*x) * a^r % p = 1,显然a^(k*x)%p = 1,而由于a^(p-1) % p = 1,所以a^r % p = 1,而0 < r < x并且x是满足条件最小的值,因此假设不成立。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int INF=0x3f3f3f3f;

long long mod;
int a,p;

int Pow(long long m,int k){
    long long ans=1;
    while(k){
        if(k&1){
            ans*=m;
            ans%=mod;
        }
        m*=m;
        m%=mod;
        k>>=1;
    }
    return ans;
}

int solve(){
    p--;
    int ans=INF;
    for(int i=1;i*i<=p;i++)
        if(p%i==0){     //最小的满足要求的x一定是p-1的因子
            if(Pow(a,i)==1)
                ans=min(ans,i);
            if(Pow(a,p/i)==1)
                ans=min(ans,p/i);
        }
    return ans;
}

int main(){

    freopen("input.txt","r",stdin);

    while(~scanf("%d%d",&a,&p)){
        mod=p;
        printf("%d\n",solve());
    }
    return 0;
}

 

你可能感兴趣的:(快速)