1. 程式人生 > >[BZOJ1467]Pku3243 clever Y

[BZOJ1467]Pku3243 clever Y

mil post puts template targe while return eve 0.11

傳送門

傳送門

exbsgs模板。

技術分享圖片
//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
#include<map>
typedef long long LL;
using namespace std;
LL a,b,p,d,x,y; 

template
<typename T> void read(T &x) { char ch=getchar(); x=0; T f=1; while(ch!=-&&(ch<0||ch>9)) ch=getchar(); if(ch==-) f=-1,ch=getchar(); for(;ch>=0&&ch<=9;ch=getchar()) x=x*10+ch-0; x*=f; } void exgcd(LL a,LL b,LL &d,LL &x,LL &y) {
if(!b) { x=1; y=0; d=a; return; } exgcd(b,a%b,d,y,x); y-=a/b*x; } map<LL,int>hash; LL exbsgs() { int k=0; LL t=1; if(b==1) return 0; for(;;) { exgcd(a,p,d,x,y); if(d==1) break; if(b%d) return -1; b/=d; p/=d; t=t*(a/d)%p; k++; if(t==b) return k; } hash.clear();
int m=sqrt(p); LL inv; LL now=t,a_m=1; for(int i=1;i<=m;i++) { now=now*a%p; a_m=a_m*a%p; if(now==b) return i; if(!hash[now]) hash[now]=i; } exgcd(a_m,p,x,inv,y); inv=(inv+p)%p; for(int i=1;i<=p/m+1;i++) { b=b*inv%p; if(hash[b]) return i*m+hash[b]; } return -1; } int main() { for(;;) { read(a); read(p); read(b); if(!a&&!p&&!b) break; LL ans=exbsgs(); if(ans==-1) puts("No Solution"); else printf("%lld\n",ans); } return 0; }
View Code

[BZOJ1467]Pku3243 clever Y