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

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

给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\)

求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\)

\(0\leq a,\ b,\ t,\ P\leq10^9,\ P\) 为质数

BSGS


首先化式子,推得

\[X_k=a^{k-1}x+b\displaystyle\sum_{i=0}^{k-2}a_i\]

因此

\[\begin{aligned}\displaystyle\sum_{i=0}^{k-2}a_i&\equiv\frac{t-a^{k-1}x}{b}\pmod P\\\frac{a^{k-1}-1}{a-1}&\equiv\frac{t-a^{k-1}x}{b}\pmod P\\a^{k-1}(b-x+ax)&\equiv at-t+b\pmod P\\a^{k-1}&\equiv\frac{at-t+b}{b-x+ax}\pmod P\end{aligned}\]

所以上 \(BSGS\)

然而这题特判很恶心,不加特判 \(0\text{pts}\)

特判如下:

  • \(x=t:ans=1\)
  • \(a=1\)
    • \(b=0:ans=-1\)
    • \(b\neq0:ans=\frac{t-x}{b}+1\)
  • \(a=0\)
    • \(b=t:ans=2\)
    • \(b\neq t:ans=-1\)

时间复杂度 \(O(T\sqrt P)\)

代码

#include 
using namespace std;int P;int qp(int a, int k) { int res = bool(a); for (; k; k >>= 1, a = 1ll * a * a % P) { if (k & 1) res = 1ll * res * a % P; } return res % P;}int bsgs(int a, int b) { if (!a && b) return -1; map
s; int sz = sqrt(P), inv_a = qp(a, P - 2), pw = qp(a, sz), cur = 1; for (int i = 0; i <= sz; i++) { s.insert(make_pair(1ll * b * cur % P, i)), cur = 1ll * cur * inv_a % P; } cur = 1; map
:: iterator it; for (int i = 0; i <= sz; i++, cur = 1ll * cur * pw % P) { if ((it = s.find(cur)) != s.end()) { return i * sz + (it -> second); } } return -1;}int main() { int Tests, a, b, x, t, A, B; scanf("%d", &Tests); while (Tests--) { scanf("%d %d %d %d %d", &P, &a, &b, &x, &t); a %= P, b %= P, x %= P, t %= P; if (x == t) { puts("1"); continue; } else if (a == 1) { if (!b) { puts("-1"); continue; } printf("%d\n", 1ll * (t - x + P) * qp(b, P - 2) % P + 1); continue; } else if (!a) { puts(b == t ? "2" : "-1"); continue; } A = a, B = 1ll * (1ll * a * t - t + b + P) % P * qp((b - x + 1ll * a * x + P) % P, P - 2) % P; int ans = bsgs(A, B); printf("%d\n", ~ans ? ans + 1 : ans); } return 0;}

转载于:https://www.cnblogs.com/Juanzhang/p/10659176.html

你可能感兴趣的文章
python基础一 day11 装饰器复习
查看>>
使用vs code编写Markdown文档以及markdown语法详解
查看>>
asp.net 关闭子窗体 刷新主窗体
查看>>
安全测试===BurpSuite使用教程-附安装包
查看>>
Chrome不能在网易网盘中上传文件的解决办法
查看>>
Axure实现多用户注册验证
查看>>
uva11292-Dragon of Loowater
查看>>
05-表操作
查看>>
实时通讯系列目录篇之SignalR详解
查看>>
Spring aop练手
查看>>
The Suspects-并查集(4)
查看>>
收藏夹代码
查看>>
string 、stringbuffer 、stringbuilder 的区别
查看>>
k-medoids与k-Means聚类算法的异同
查看>>
Linux下安装SVN服务端
查看>>
Tomcat 部署项目的三种方法
查看>>
删数问题(贪心)
查看>>
蓝桥杯-矩阵翻硬币
查看>>
button设置边宽和圆角
查看>>
Warning:The /usr/local/mysql/data directory is not owned by the 'mysql' or '_mysql'
查看>>