[BZOJ1467]Pku3243 clever Y

Posted Achen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ1467]Pku3243 clever Y相关的知识,希望对你有一定的参考价值。

传送门

传送门

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的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1467/2480Pku3243 clever Y/Spoj3105 Mod EXBSGS

BZOJ 3243 Clever Y

POJ3243 Clever Y大步小步法

Clever Y POJ - 3243 (扩展BSGS)

POJ 3243Clever Y 拓展BSGS

POJ3243:Clever Y——题解