[SDOI2013] 随机数生成器
BSGS对于高阶同余方程的求解
通过题目给出的式子
1
2
3
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define pb push_back
#define pii pair<int,int>
#define all(x) x.begin(),x.end()
int qpw(int a,int b,int mod){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int inv(int x,int mod){
return qpw(x,mod-2,mod);
}
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
int bsgs(int a,int b,int mod){
a%=mod,b%=mod;
unordered_map<int,int>mp;
int m=ceil(sqrt(mod)),t=b;
mp[b]=0;
for(int j=1;j<m;j++){
t=t*a%mod;
mp[t]=j;
}
int mi=1;
for(int i=1;i<=m;i++){
mi=mi*a%mod;
}
t=1;
for(int i=1;i<=m;i++){
t=t*mi%mod;
if(mp.count(t)){
return i*m-mp[t];
}
}
return -1;
}
void solve() {
int p,a,b,x,t;
cin>>p>>a>>b>>x>>t;
if(x==t)cout<<1<<'\n';
else if(a==1){
t=((t-x)%p+p)%p;
if(t%gcd(b,p)){
cout<<-1<<'\n';
}else {
if((t*inv(b,p)+1)%p==0){
cout<<p<<'\n';
}else {
cout<<(t*inv(b,p)+1)%p<<'\n';
}
}
}else if(a==0){
if(b==t){
cout<<2<<'\n';
}else {
cout<<-1<<'\n';
}
}else {
long long ans = bsgs(a, ((t - b * inv(1 - a, p)) % p + p) % p * inv(((x - b * inv(1 - a, p)) % p + p) % p, p), p) % p;
if(ans==-1){
cout<<-1<<'\n';
}else cout<<ans+1<<'\n';
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int _=1;
cin>>_;
while(_--)solve();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现