本地和洛谷 IDE 测试均AC,提交TLE?
查看原帖
本地和洛谷 IDE 测试均AC,提交TLE?
525234
__int128__楼主2023/4/29 13:19

rt,测试的就是原数据/kk

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<stack>
#include<bitset>
#include<map>
#include<set>
#include<unordered_map>
#include<ctime>
#include<random>
#define gc getchar
#define pc putchar
#define p__ puts("")
#define debug puts("-1")
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define int long long
using namespace std;
inline int rd(){
	int x=0,f=1;char ch=gc();
	while(!isdigit(ch)){if(ch=='-')f=-1;ch=gc();}
	while(isdigit(ch)){x=x*10+ch-48;ch=gc();}return x*f;
}
inline void write(int x,char ch='\0'){
	if(x<0){x=-x;pc('-');}
	int y=0;char z[30];
	while(!y||x)z[y++]=x%10+48,x/=10;
	while(y--)pc(z[y]);if(ch!='\0')pc(ch);
}
int mod,a,b;
int mul(int &x,int y){x=x*y%mod;}
int ksm(int x,int y){
	int res=1;
	while(y){
		if(y&1)mul(res,x);mul(x,x);y>>=1;
	}
	return res;
}
int gcd(int x,int y){
	return !y?x:gcd(y,x%y);
}
unordered_map<int,int>vis;
int BSGS(int a,int b,int p){
	int t=sqrt(p)+1;
	int x=b%p;
	rep(i,0,t-1)vis[x]=i+1,mul(x,a);
	x=ksm(a,t);
	int tmp=x;
	rep(i,1,t){//phi(t)=t-1
		if(vis[tmp]) return i*t-vis[tmp]+1;
		mul(tmp,x);
	}
	return -1;
}
signed main(){
	mod=rd(),a=rd(),b=rd();
	if(b%gcd(a,mod)) return puts("no solution"),0;
	int res=BSGS(a,b,mod);	
	if(res==-1) puts("no solution");
	else write(res);
}
/*
a^x = b (mod p)
order T=sqrt(p),then:
x=A*x-B
a^(A*x)=b*a^B(mod p)
put b*a^B into hash[]
brute for a A
*/
2023/4/29 13:19
加载中...