BSGS
BSGS裸题,找了hzw的当了个板子。
太懒没打哈希表
(缺氧的POJ用map会T)
代码:
#include<map>
#include<cmath>
#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int m,a,b;
map <int,int> mp;
typedef long long LL;
inline LL ksm(LL a,LL b){
LL ret=1; a%=m;
while (b){
if (b&1) ret=ret*a%m;
a=a*a%m,b>>=1;
}
return ret;
}
int main(){
while (scanf("%d%d%d",&m,&a,&b)!=EOF){
a%=m,mp.clear();
if ((!a)&&(!b)) { puts("1"); continue; }
if (!a) { puts("no solution"); continue; }
int c=ceil(sqrt(m)); LL x=1; bool flag=false; mp[1]=c+1;
for (int i=1;i<c;i++){ x=x*a%m; if (!mp[x]) mp[x]=i; }
for (LL i=0,n=1,tem=ksm(a,m-c-1);i<c;i++){
int l=mp[b*n%m];
if (l) {
if (l==c+1) l=0;
printf("%lld\n",i*c+l);
flag=true; break;
}
n=n*tem%m;
}
if (!flag) puts("no solution");
}
return 0;
}