40pts求助,调对WA的点就行,悬2棺
查看原帖
40pts求助,调对WA的点就行,悬2棺
812227
Sunrise_beforeglow楼主2024/10/23 17:23
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,p,b;
int baby[100005],g[100005];
map<int,int>mp;
int BSGS(int a,int b,int p,int x)
{
    int lena=sqrt(p),lenb=p/lena+1;
    baby[0]=1;
    for(int i=1;i<lena;i++)
    {
        baby[i]=baby[i-1]*a%p;
    }
    g[0]=1;
    g[1]=baby[lena-1]*a%p;
    for(int i=2;i<=lenb;i++)
    {
        g[i]=g[i-1]*g[1]%p;
    }
    mp.clear();
    for(int i=0;i<lena;i++)mp[baby[i]*b%p]=i;
    for(int i=1;i<=lenb;i++)
    {
        if(mp.count(g[i]*x%p))
        {
            return (i*lena-mp[g[i]])%p;
        }
    }
    return -1;
}
int exBSGS(int a,int b,int p)
{
    a%=p,b%=p;
    if(b==1||p==1)return 0;
    if(!a)
    {
        if(b)return -1;
        else return 1;
    }
    int cnt=0,ans=1;
    while(__gcd(a,p)!=1)
    {
        int d=__gcd(a,p);
        if(b%d!=0)return -1;
        cnt++;
        p/=d,b/=d;
        ans=ans*(a/d)%p;
    }
    int res=BSGS(a,b,p,ans);
    if(res==-1)return -1;
    return res+cnt;
}
signed main()
{
    cin>>a>>p>>b;
    while(a|p|b)
    {
        int ans=exBSGS(a,b,p);
        if(ans==-1)cout<<"No Solution\n";
        else cout<<ans<<"\n";
        cin>>a>>p>>b;
    }
    return 0;
}
2024/10/23 17:23
加载中...