bzoj3122 [SDOI2013]随机数生成器

给定一个递推式, \(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 <bits/stdc++.h>
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 <int, int> 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 <int, int> :: 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

bzoj3122 [SDOI2013]随机数生成器相关推荐

  1. bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意 ...

  2. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

  3. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...

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

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

  5. 牛客——[SDOI2013]随机数生成器(推公式+BSGS)

    链接:https://ac.nowcoder.com/acm/problem/20362 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

    [SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式,考虑化成等比数列 xi+1+k=a(xi+k)=a⋅xi+b+t ...

  7. Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom

    Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...

  8. 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

    原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器                本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...

  9. P5147 随机数生成器 [数列]

    P5147 随机数生成器 数学老师看不懂系列 看题目这一片代码就很晕: int work(int x) {if(x==1)return 0;else return work(rand(1,x))+1; ...

最新文章

  1. 【Kaggle-MNIST之路】CNN+改进过的损失函数+多次的epoch(四)
  2. 小Z的房间[HEOI2015] (matrix-tree定理)
  3. java日志处理汇总
  4. 像素画高级教程:怎样画流动的水
  5. yum配置文件 重启后还原_江湖救急 : CentOS7.5 /usr 目录误删, 恢复操作.
  6. Python(13)-函数,lambda语句
  7. java 自定义报表_设计好的报表是如何在 web 上显示的
  8. 机器视觉:PC式视觉系统与嵌入式视觉系统区别
  9. 0514JS练习:函数
  10. 天龙八部linux 换win,Linux从菜鸟到大师之天龙八部 第三部文本编辑处理.doc
  11. 对视频播放url进行Blob加密
  12. python爬取qq群成员_Python爬取QQ群群员
  13. HC05 蓝牙控制LED问题
  14. 题解 2020级HAUT新生周赛(二)
  15. FL Studio20.9DAW宿主电子音乐制作软件
  16. (数据结构基础)Among the following threaded binary trees (the threads are represented by dotted curves),……
  17. oracle重做日志详解,oracle数据文件、控制文件、重做日志文件详解
  18. chatgpt为什么在中国不能用
  19. Redis 实现搜索关键词自动补全
  20. 沃尔什函数 与 沃尔什-哈达玛变换

热门文章

  1. boost::hana::sum用法的测试程序
  2. boost::describe模块宏BOOST_DESCRIBE_PP_POINTER的测试程序
  3. boost::core模块实现分配器重新绑定的实例
  4. Boost:bzip2解压缩器
  5. ITK:在图像区域上运行图像过滤器
  6. VTK:图片之PickPixel
  7. OpenCV使用Sobel或Scharr OpenCV函数进行边缘检测的实例(附完整代码)
  8. OpenCV 错误级别分析ELA的实例(附完整代码)
  9. C++ 循环链表circular linked list实现算法(附完整源码)
  10. C++Miller Rabin算法的实现(附完整源码)