博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDOI2013 随机数生成器
阅读量:5364 次
发布时间:2019-06-15

本文共 1275 字,大约阅读时间需要 4 分钟。

题解:

将原式处理成A^x≡B(mode C)的形式即可。

代码:

#include#include
#include
#include
#include
using namespace std;#define ll long longll fastpow(ll x,ll y,ll p){ ll ret = 1ll; while(y) { if(y&1)ret=ret*x%p; x=x*x%p; y>>=1; } return ret;}ll F2(ll y,ll z,ll p){ y%=p,z%=p; ll ret = fastpow(y,p-2,p); return ret*z%p;}map
mp;void BSGS(ll y,ll z,ll p){ y%=p,z%=p; if(!y&&z) { printf("-1\n"); return ; } mp.clear();mp[1]=0; ll now = 1;ll m = (ll)sqrt(p); for(ll i=1;i<=m;i++) { now=now*y%p; if(mp.find(now)==mp.end()) mp[now]=i; } ll u = 1; for(ll i=0;i<=m+2;i++) { ll tmp = F2(u,z,p); if(mp.find(tmp)!=mp.end()) { ll ans = mp[tmp]; printf("%lld\n",ans+i*m+1); return ; } u=u*now%p; } printf("-1\n");}ll T,p,a,b,x1,t;int main(){ scanf("%lld",&T); while(T--) { scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x1,&t); a%=p,b%=p; if(x1==t) { printf("1\n"); continue; } if(!a) { if(b==t)printf("2\n"); else printf("-1\n"); continue; } if(a==1) { if(!b&&t-x1) { printf("-1\n"); }else printf("%lld\n",F2(b,t-x1+p,p)+1); continue; } ll k = (ll)F2(a-1,b,p); BSGS(a,(t+k)*fastpow(x1+k,p-2,p),p); } return 0;}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/10046068.html

你可能感兴趣的文章
bzoj 4260: Codechef REBXOR (01 Trie)
查看>>
学好python
查看>>
css-IE中的border-radius和box-shadow
查看>>
利用bootstrap和webform的异步CRUD及分页
查看>>
HDUOJ 1879继续畅通工程(并查集)
查看>>
OC12_自动释放池
查看>>
Saiku资源帖
查看>>
解决手机页面中点击文本框,网页放大问题
查看>>
2-5
查看>>
牛客多校3 A-PACM Team(状压降维+路径背包)
查看>>
HDU - 4284 Travel(floyd+状压dp)
查看>>
1027 制作表格
查看>>
Android之Socket通信、List加载更多、Spinner下拉列表
查看>>
面向对象的介绍与特性
查看>>
typing-python用于类型注解的库
查看>>
20189215 2018-2019-2 《密码与安全新技术专题》第13周作业
查看>>
第四周作业
查看>>
一、HTML基础
查看>>
蓝牙进阶之路 (002) - HC-05与HC-06的AT指令的区别(转)
查看>>
mysql的limit经典用法及优化
查看>>