社区讨论

求助

P3306[SDOI2013] 随机数生成器参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo8hxcw4
此快照首次捕获于
2023/10/27 18:54
2 年前
此快照最后确认于
2023/10/27 18:54
2 年前
查看原帖
原题:P3306
代码:
CPP
//the code is from pkl
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
map<LL,LL> x;
LL T,p,a,b,x1,t,ans;
LL binpow(LL n,LL k,LL mod){
	LL res=1;n%=mod;
	while(k){
		if(k&1){
			res=res*n%mod;
		}
		n=n*n%mod;
		k>>=1;
	}
	return res;
}
LL BSGS(LL a,LL b,LL mod){
	a%=mod;b%=mod;
	if(a==0){
		return b==0?1:-1;
	}
	if(b==1){
		return 0;
	}
	LL m=ceil(sqrt(mod-1)),inv=binpow(a,mod-m-1,mod);
	x.clear();
	x[1]=m;
	for(LL i=1,e=1;i<m;i++){
		e=e*a%mod;
		if(!x[e]){
			x[e]=i;
		} 
	}
	for(LL i=0;i<m;i++){
		if(x[b]){
			LL res=x[b];
			return i*m+(res==m?0:res);
		}
		b=b*inv%mod;
	}
	return -1;
}
LL get(){
	LL inv=binpow(a*x1-x1+b,p-2,p);
	LL res=BSGS(a,(a*t-t+b)%p*inv%p,p);
	return res==-1?-1:(res+1);
}
int main(){
	scanf("%lld",&T);
	while(T--){
		scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t);
		ans=get();
		printf("%lld\n",ans);
	}
}
不知道为什么,样例过了,交上去0分。

回复

1 条回复,欢迎继续交流。

正在加载回复...