POJ 2417 Discrete Logging (BSGS)

来源:互联网 发布:雅思自测软件 编辑:程序博客网 时间:2024/06/05 21:02

AC代码:

#include <iostream>#include <cstdio>#include <string.h>#include <cmath>#include <map>typedef long long int lli;using namespace std;inline lli qp(lli a,lli x,lli c){    lli ans = 1;    for(;x;x>>=1){        if(x&1) ans = ans*a % c;        a = a*a % c;    }    return ans;}lli bsgs(lli a,lli b,lli c){    lli m = ceil(sqrt(c));    map<lli,lli> has;    lli temp = 1;    lli special = b*temp%c;    for(int j = 0;j <= m;j++){        has[b*temp%c] = j;        temp = temp*a %c; // 注意这里 如果贪图省事不%c的话 会炸lli    }    temp = qp(a,m,c);    lli ans = temp;    for(int i = 1;i <= m;i++){        if(has[ans]){ // has.count(ans) T了  然后这里就很有趣了。            ans = (i*m-has[ans]);            printf("%lld\n",(ans%c+c)%c);            return 1;        }        if(ans == special){            ans = (i*m);            printf("%lld\n",(ans%c+c)%c);            return 1;        }        ans = ans * temp % c;    }    return 0;}int main(){    lli c,a,b;    while(~scanf("%lld%lld%lld",&c,&a,&b)){        if(c%a == 0 || !bsgs(a,b,c) ){            printf("no solution\n");            continue;        }    }    return 0;}
1 0
原创粉丝点击