BSGS简叙

#include 
using namespace std;
#define ll long long
const int maxn=1e6+7;
const int mod=998244353;
const int INF=0x3f3f3f3f;
/*
   BSGS算法  b^l==n%p  求解最小的l
   不妨直接把l拆分成i*m-j,这样的话同余方程就变为b^(i*m)==n*b^j%p
   直接枚举j属于[0,m) m=ceil///向上取整(sqrt(p)) map记录当前的j的数值
   随后枚举i属于[0,m)查询map是否存在j满足且需要满足i*m>j=op[s]
   很显然这只是gcd(b,p)=1的情况,此时枚举只到了m-2与费马小定理对应
*/
mapop;
ll p,b,n;
ll quick_pow(ll a,ll b,ll p)
{
   ll ans=1;
   while (b)
   {
    if (b&1)///b为奇数
        ans=(ans*a)%p;
     a=(a*a)%p;///b为偶数
     b>>=1;
   }
   return ans;
}
ll BSGS(ll p,ll b,ll n)
{
    ll m=ceil(sqrt(p));
    for (ll i=0,s=n;i=op[s])return i*m-op[s];
        }
    }
    return -1ll;
}
int main()
{
    scanf("%lld%lld%lld",&p,&b,&n);///b^l==n%p
    ll cnt=BSGS(p,b,n);
    cnt==-1ll?cout<<"no solution"<

你可能感兴趣的:(BSGS简叙)