P3306 [SDOI2013]随机数生成器(bzoj3122)
、
\(0\le a\le P−1,0\le b\le P−1,2\le P\le 10^9\)
Sample Input
3
7 1 1 3 3
7 2 2 2 0
7 2 2 2 1
Sample Output
1
3
-1
推一下前几项就能知道:
\]
\]
然后肯定要求逆元,我们设\((a-1)^{-1}=inv\)
那么原式:
\]
\]
\]
所以此时只要求出那个分母的逆元,然后用 BSGS 就行了
但是注意 BSGS 得到的答案要加一,但此时不能再取模了,不然成\(0\)显然不合理
然后开始烦人的特判
- \(x_1=t\rightarrow n=1\)
- \(a=0\),则只需判断是不是\(b=t\),如果是那么第二天就能读到,不然永远读不到
- \(a=1\rightarrow t\equiv x_n\equiv x_1+b(n-1)\),此时还要分两种:
- \(b=0\),无解,因为前面已经判定过是不是\(x_1=t\)了,所以现在肯定是不相等
- \(n=\dfrac{t-x_1}{b}+1\),此时为了防止模成\(0\),再乘逆元的时候取一次模,后面的加一仍然不取模
这些虽然不难但不看题解我还是没有想全
还有一个问题,就是 BSGS 的时候,求解\(a^x\equiv n\pmod p\),不能判断\(p\mid a\)就立刻返回无解,因为如果此时\(n=0\),那么是要返回\(0\)的
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
std::map<LL,LL>map;
inline int power(int a,int b,int p){
int ret=1;
while(b){
if(b&1) ret=1ll*ret*a%p;
b>>=1;a=1ll*a*a%p;
}
return ret;
}
inline LL BSGS(LL a,LL n,LL p){
if(!(a%p)){
if(n) return -1;
else return 0;
}
map.clear();
reg LL m=std::ceil(std::sqrt(p));
for(reg LL i=0,s=n;i<m;i++,s=s*a%p) map[s]=i;
for(reg LL i=1,s=power(a,m,p),tmp=s;i<=m;i++,s=s*tmp%p)
if(map.find(s)!=map.end()) return i*m-map[s];
return -1;
}
int main(){int T=read();while(T--){
LL p=read(),a=read(),b=read(),x1=read(),t=read();
if(x1==t) std::puts("1");
else if(!a) std::puts(b==t?"2":"-1");
else if(a==1){
if(!b) std::puts("-1");
else{
t=(t-x1+p)%p;
std::printf("%lld\n",(t*power(b,p-2,p)%p)+1);
}
}
else{
LL inv=power(a-1,p-2,p);
t=(t+(b*inv%p))%p;
LL ans=BSGS(a,t*power((x1+(b*inv%p))%p,p-2,p)%p,p);
if(~ans) std::printf("%lld\n",ans+1);
else std::puts("-1");
}
}
return 0;
}
P3306 [SDOI2013]随机数生成器(bzoj3122)的更多相关文章
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
- 洛谷P3306 [SDOI2013]随机数生成器(BSGS)
传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...
- P3306 [SDOI2013]随机数生成器
思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)
题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...
- 【bzoj3122】 Sdoi2013—随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 (题目链接) 题意 对于一个数列${X_i}$,其递推式为:${X_{i+1}=(a*X_i+ ...
随机推荐
- GitHub+PicGo构建免费图床及其高效使用
搭建免费图床全过程! 一.搭建缘由 一开始搭建博客,避免不了要用许多图片,最初使用七牛云来做博客图床,但是后来发现,七牛云只有30天的临时域名,hhhhhhh,果然啊,天下就没有免费的好事啊~后来就发 ...
- Jmeter使用Websocket插件测试SingalR,外加还有阿里云PTS的Jmeter原生测试爬坑日志。
题外话:距离我的上一篇博客已经过去7年多了,我实在是个不务正业的程序员,遇到测试方面的东西总想分享一下,因为可用的资料实在太少了(包括国外的资料). 本人不喜欢授人以鱼,所以不会直接给出问题和解决方案 ...
- 七、环回接口ip地址(逻辑接口)
loopback接口,在网络设备(一般是路由器)上是一种特殊的接口,它不是物理接口,而是一种看不见摸不着的逻辑接口(也称虚拟接口),但是对于网络设备来说却是至关重要的. 在网络设备上可以通过配置命令来 ...
- CSS盒模型属性详细介绍
一.概述 CSS盒模型是定义元素周围的间隔.尺寸.外边距.边框以及文本内容和边框之间内边距的一组属性的集合. 示例代码: <!DOCTYPE html> <html lang=&qu ...
- JS生成随机颜色(rgb)
/*随机获取颜色*/ function getRandomColor() { var r = Math.floor(Math.random() * 256); var g = Math.floor(M ...
- mapstruct使用详解
我们都知道,随着一个工程的越来越成熟,模块划分会越来越细,其中实体类一般存于 domain 之中,但 domain 工程最好不要被其他工程依赖,所以其他工程想获取实体类数据时就需要在各自工程写 mod ...
- PHP出现SSL certificate:unable to get local issuer certificate的解决办法
当本地curl需要访问https时,如果没有配置证书,会出现SSL certificate: unable to get local issuer certificate错误信息. 解决办法: 1.下 ...
- ViewDragHelper的点击事件处理
在上一篇ViewDragHelper的介绍后,已经完成了自定义控件SwipeLayout的滑动,这一篇,我们来处理它的点击事件.之前提到过,它有两个子view,最开始显示的是surfaceLayout ...
- jdbc-手写Java方法连接数据库
一.关键四元素 ① com.mysql.jdbc.Driver mysql数据库连接jar包. 获取途径: 链接:https://pan.baidu.com/s/1SFcjuu ...
- SeleniumHQ
下载地址:http://www.seleniumhq.org/download/