萌新刚学OI1ms不会BSGS10pts求调
查看原帖
萌新刚学OI1ms不会BSGS10pts求调
906856
A2_Zenith楼主2023/9/24 20:53
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<iomanip>
#include<map>
#define int long long
#define db long double
#define pii pair<int,int>
#define up(i,l,r) for(int i=(l);i<=(r);i++)
#define down(i,l,r) for(int i=(l);i>=(r);--i)
#define p_b push_back
#define m_p make_pair
using namespace std;
//LONG LIVE BRUTE-FORCE ALGORITHM!!!
const int mod=1e9+7;
int qpow(int a,int b,int p){
    int ans=1;
    for(int i=b;i>0;i>>=1,a=a*a%p)if(b&1)ans=ans*a%p;
    return ans;
}
int BSGS(int a,int b,int p){
    map<int,int> hsh;
    hsh.clear();
    int t=sqrt(p)+1;
    b%=p;
    for(int i=0;i<t;i++){
        hsh[b*qpow(a,i,p)%p]=i;
    }
    a=qpow(a,t,p);
    if(a==0){
        //cout<<"Fst"<<endl;
        return b==0?1:-1;
    }
    for(int i=1;i<=t;i++){;
        int cur=qpow(a,i,p);
        cout<<(hsh.find(cur)==hsh.end())<<endl;
        if(hsh.find(cur)!=hsh.end()){
            int j=hsh[cur];
            if(i*t-j>=0)return i*t-j;
        }
    }
    return -1;
}
signed main(){
    int p,b,n;
    cin>>p>>b>>n;
    if(BSGS(b,n,p)==-1)cout<<"no solution"<<endl;
    else cout<<BSGS(b,n,p);
}


2023/9/24 20:53
加载中...