1492: 费马定理 (快速幂)
1492: 费马定理
http://www.acmore.net/problem.php?id=1492
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
数学题,由于已经告知费马定理的存在,那么可以证明最小的满足要求的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; }