bzoj 3239: Discrete Logging BSGS

来源:互联网 发布:java表格代码怎么写 编辑:程序博客网 时间:2024/06/04 20:12

题意

给出b,p,n,求一个l,使得bl=n(modp)

分析

离散对数模板题,当复习一波。
思路是把l分块,然后扔进map里。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<cmath>#include<map>#define LL long longusing namespace std;int p,b,n;map<int,int> w;int ksm(int x,int y){    int ans=1;    while (y)    {        if (y&1) ans=(LL)ans*x%p;        x=(LL)x*x%p;y>>=1;    }    return ans;}int solve(){    int ny=ksm(b,p-2),m=sqrt(p);    w.clear();    int v=n;w[n]=-1;    for (int i=1;i<m;i++)    {        v=(LL)v*ny%p;        if (!w[v]) w[v]=i;    }    b=ksm(b,m);v=1;    for (int i=0;i<=m;i++)    {        int x=w[v];        if (x)        {            if (x==-1) return i*m;            else return i*m+x;        }        v=(LL)v*b%p;    }    return -1;}int main(){    while (scanf("%d%d%d",&p,&b,&n)!=EOF)    {        int ans=solve();        if (ans==-1) printf("no solution\n");        else printf("%d\n",ans);    }    return 0;}
0 0
原创粉丝点击