洛谷

bzoj

特判+多测真恶心

\(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

推一下前几项就能知道:

\[x_n\equiv t\equiv a^{n-1}x_1+b\sum_{i=0}^{n-2}a^i\pmod p
\]

\[t\equiv a^{n-1}x_1+b\frac{a^{n-1}-1}{a-1}\pmod p
\]

然后肯定要求逆元,我们设\((a-1)^{-1}=inv\)

那么原式:

\[t\equiv a^{n-1}x_1+ba^{n-1}\cdot inv-b\cdot inv\pmod p
\]

\[t+b\cdot inv\equiv a^{n-1}(x_1+b\cdot inv)\pmod p
\]

\[a^{n-1}\equiv \frac{t+b\cdot inv}{x_1+b\cdot inv}\pmod p
\]

所以此时只要求出那个分母的逆元,然后用 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)的更多相关文章

  1. 洛咕 P3306 [SDOI2013]随机数生成器

    洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...

  2. 洛谷P3306 [SDOI2013]随机数生成器(BSGS)

    传送门 感觉我BSGS都白学了……数学渣渣好像没有一道数学题能自己想出来…… 要求$X_{i+1}=aX_i+b\ (mod \ \ p)$ 左右同时加上$\frac{b}{a-1}$,把它变成等比数 ...

  3. P3306 [SDOI2013]随机数生成器

    思路:\(BSGS\) 提交:\(1\)次 题解: 原式可以化为\[x_{i+1}+\frac{b}{a-1}=a(x_{i}+\frac{b}{a-1})\mod p\] 这不是等比数列吗? \[x ...

  4. bzoj3122 [SDOI2013]随机数生成器

    bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...

  5. 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判

    [BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b, ...

  6. 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS

    [bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t  n=1 当 a=1  当 a=0 判断b==t /* http: ...

  7. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  8. 【洛谷 P3306】[SDOI2013]随机数生成器 (BSGS)

    题目链接 怎么这么多随机数生成器 题意见原题. 很容易想到\(BSGS\)算法,但是递推式是\(X_{i+1}=(aX_i+b)\mod p\),这显然不是一个等比数列. 但是可以用矩阵乘法来求出第\ ...

  9. 【bzoj3122】 Sdoi2013—随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 (题目链接) 题意 对于一个数列${X_i}$,其递推式为:${X_{i+1}=(a*X_i+ ...

随机推荐

  1. python 网络编程---粘包

    一.什么是粘包?(只有在TCP中有粘包现象,在UDP中永远不会粘包) 黏包不一定会发生. 如果发生 了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了. 所谓的粘包问题:主要是是因为 ...

  2. 汇编刷题:屏幕显示 HOW ARE YOU!

    DATA SEGMENT INFO DB 'HOW ARE YOU!$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DAT ...

  3. Dos 命令启动网卡

    禁用网卡: netsh interface set interface "本地连接" disabled 启用网卡 : netsh interface set interface & ...

  4. MySQL学习之路7-索引、事务、函数、存储过程、游标

    索引 使用索引快速定位某列中特定值的行,不需要遍历数据表所有行. 创建索引的数据结构:BTREE and HASH. 主键也是一种索引,Primary key. show index from ord ...

  5. Go语言的GPM调度器是什么?

    我是平也,这有一个专注Gopher技术成长的开源项目「go home」 导读 相信很多人都听说过Go语言天然支持高并发,原因是内部有协程(goroutine)加持,可以在一个进程中启动成千上万个协程. ...

  6. replace into 影响行数

    replace into 影响行数,谈起影响行数,先理解replace into 原理:其是先到表里通过一定规则(单主键或复合主键或唯一索引)找到记录,并且删除,然后在insert into 记录,即 ...

  7. Nginx+uWSGI+Python+Django构建必应高清壁纸站

    写在前面 做这个网站的初衷是因为,每次打开必应搜索搜东西的时候都会被上面的背景图片吸引,我想必应的壁纸应该是经过专业人员精选出来的,我甚至会翻看以前的历史图片,唯一美中不足的是必应的首页只能查看最多7 ...

  8. animation-play-state 在 ios 中不生效的解决办法(JS篇)

    我们要实现动画的播放和暂停,animation-play-state 在安卓端可以使用,但是在 ios 中不起作用,这时可以使用 js 来实现相同效果. 原理 通过 js 获取当前元素的 transf ...

  9. Xshell 设置右键粘贴即是复制

    打开工具->选项->键盘和鼠标面板     1.鼠标部分的右击设置"粘贴剪切板的内容".    2.选择部分,在"自动将所选文本复制到剪切板"前打勾

  10. 深度剖析前端JavaScript中的原型(JS的对象原型)

          这张图片有点劝退了,哈哈哈~    通过原型机制,JavaScript 中的对象从其他对象继承功能特性:这种继承机制与经典的面向对象编程语言的继承机制不同.本文将探讨这些差别,解释原型链如 ...