整理的算法模板合集: ACM模板

点我看算法全家桶系列!!!

实际上是一个全新的精炼模板整合计划


发个水题的 题解证明我还在()

luogu P3306 [SDOI2013] 随机数生成器

Weblink

https://www.luogu.com.cn/problem/P3306

Problem

最近小 W 准备读一本新书,这本书一共有 ppp 页,页码范围为 0∼p−10 \sim p-10∼p−1。

小 W 很忙,所以每天只能读一页书。为了使事情有趣一些,他打算使用 NOI2012 上学习的线性同余法生成一个序列,来决定每天具体读哪一页。

我们用 xix_ixi​ 来表示通过这种方法生成出来的第 iii 个数,也即小 W 第 iii 天会读哪一页。这个方法需要设置 333 个参数 a,b,x1a,b,x_1a,b,x1​ ,满足 0≤a,b,x1<p0\leq a,b,x_1\lt p0≤a,b,x1​<p,且 a,b,x1a,b,x_1a,b,x1​

都是整数。按照下面的公式生成出来一系列的整数:

xi+1≡a×xi+b(modp)x_{i+1} \equiv a \times x_i+b \pmod pxi+1​≡a×xi​+b(modp)

其中 modmodmod 表示取余操作。

但是这种方法可能导致某两天读的页码一样。

小 W 要读这本书的第 ttt 页,所以他想知道最早在哪一天能读到第 ttt 页,或者指出他永远不会读到第 ttt 页。

Solution

根据题意我们可以得到一个递推公式:

xn=axn+1+bx_n=ax_{n+1}+b xn​=axn+1​+b
(经典高中数列套路)设:
xn+c=a(xn−1+c)xn+c=axn−1+acxn=axn−1+ac−cxn=axn−1+(a−1)c→(a−1)c=b→c=ba−1xn+ba−1=a(xn−1+ba−1)\begin{aligned}& x_n+c=a(x_{n-1}+c)\\&x_n+c=ax_{n-1}+ac\\&x_n=ax_{n-1}+ac-c\\&x_n=ax_{n-1}+(a-1)c\\&\to(a-1)c=b\to c=\frac{b}{a-1} \\& x_n+\frac{b}{a-1}=a(x_{n-1}+\frac{b}{a-1})\end{aligned} ​xn​+c=a(xn−1​+c)xn​+c=axn−1​+acxn​=axn−1​+ac−cxn​=axn−1​+(a−1)c→(a−1)c=b→c=a−1b​xn​+a−1b​=a(xn−1​+a−1b​)​

即可得到:

xn+ba−1=a(xn−1+ba−1)=a(a(xn−2+ba−1))=⋯=an−1(x1+ba−1)\begin{aligned}x_n+\frac{b}{a-1}&=a(x_{n-1}+\frac{b}{a-1})\\&=a(a(x_{n-2}+\frac{b}{a-1}))\\&=\cdots\\&=a^{n-1}(x_1+\frac{b}{a-1})\end{aligned} xn​+a−1b​​=a(xn−1​+a−1b​)=a(a(xn−2​+a−1b​))=⋯=an−1(x1​+a−1b​)​

显然根据题意, xn=tx_n=txn​=t
我们就可以将答案的表达式转化为标准的高次同余方程的形式:

an−1≡t+ba−1x1+ba−1(modp)a^{n-1}\equiv \cfrac{t+\frac{b}{a-1}}{x_1+\frac{b}{a-1}}\pmod p an−1≡x1​+a−1b​t+a−1b​​(modp)

使用BSGS算法求解即可。

注意观察等式,需要特判几个特殊情况,因为有分数,分母不能为 000:

  1. a=1→a−1=0a=1\to a-1=0a=1→a−1=0
  2. a=0a=0a=0
  3. x1+ba−1=0x_1+\cfrac{b}{a-1}=0x1​+a−1b​=0
  4. a=1,b=0a=1,b=0a=1,b=0,当 n=1n=1n=1 ,xn=x1x_n=x_1xn​=x1​,当 n≥2n\ge 2n≥2,xn=bx_n=bxn​=b
  5. a=1,b≠0a=1,b≠0a=1,b​=0,xn≡xn−1+b(modp)→xn=xn−1+b→xn=(n−1)b+x1→xn≡(n−1)b+x1(modp)→b(n−1)+py=t−x1→exgcd,x=n−1x_n\equiv x_{n-1}+b\pmod p\to x_n= x_{n-1}+b\to x_n=(n-1)b + x_1\to x_n\equiv(n-1)b + x_1\pmod p\to b(n-1)+py=t-x_1\to exgcd,x=n-1xn​≡xn−1​+b(modp)→xn​=xn−1​+b→xn​=(n−1)b+x1​→xn​≡(n−1)b+x1​(modp)→b(n−1)+py=t−x1​→exgcd,x=n−1

Code

#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
typedef pair<int, int> PII;
const ll N = 5e6 + 7, INF = 0x3f3f3f3f;
const double PI = acos(-1.0), eps = 1e-8;int n, m, p, a, b, x1, t, T;int qpow(int a, int b, int mod)
{int res = 1;while(b) {if(b & 1) res = res * a % mod;a = a * a % mod;b >>= 1;}return res;
}int inv(int a, int p)
{return qpow(a, p - 2, p);
}int exgcd(int a, int b, int &x, int &y)
{if(b == 0) {x = 1; y = 0;return a;}int d = exgcd(b, a % b, x, y);int z = x;x = y, y = z - (a / b) * y;return d;
}int BSGS(int a, int b, int p)
{if (1 % p == b % p) return 0;int k = sqrt(p) + 1;unordered_map<int, int> hash;for (int i = 0, j = b % p; i < k; i ++ ){hash[j] = i;j = j * a % p;}int ak = 1;for (int i = 0; i < k; i ++ ) ak = ak * a % p;for (int i = 1, j = ak; i <= k; i ++ ){if (hash.count(j)) return  i * k % p - hash[j] % p;j = j * ak % p;}return -1;
}void solve()
{scanf("%lld%lld%lld%lld%lld", &p, &a, &b, &x1, &t);if(a == 0) {if(x1 == t) puts("1");else if(b == t) puts("2");else puts("-1");return ;}else if(a == 1) {if(b == 0) {if(x1 == t) puts("1");else puts("-1");return ;}int x, y;int d = exgcd(b, p, x, y);x = (x * (t - x1) % p / d + p) % p;printf("%lld\n", x + 1);return ;}else {int C = b * inv(a - 1, p) % p;int A = (x1 + C) % p;if(A == 0) {int res = (-C + p) % p;if(res == t) puts("1");else puts("-1");return ;}else {int B = (t + C) % p * inv(A, p) % p;int n = BSGS(a, B, p);if(n == -1) puts("-1");else printf("%lld\n", n + 1);return ;}}
}
signed main()
{scanf("%lld", &T);while(T -- ) {solve();}return 0;
}

luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)相关推荐

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

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

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

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

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

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

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

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

  5. hdu-6989 Pass!(广义斐波那契数列求通项+bsgs)

    题目链接:点击这里 题目大意: 有 nnn 个人在传球,从 111 号开始传球,每次只能传给别人,设传了 ttt 次球后球回到 111 的方案数为cntcntcnt ,求最小的 ttt 其满足此时的 ...

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

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

  7. 数论练习二之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 ...

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

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

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

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

最新文章

  1. 黄皓之后,计算机科学上帝Don Knuth仅用一页纸证明布尔函数敏感度猜想
  2. php errno 28,php7.28 编译出错 一直通不过去
  3. 计算机等级考试初级网络工程师,2019年全国计算机等级考试网络工程师四级,需..._网络编辑_帮考网...
  4. HDU2050 折线分割平面【切割平面】
  5. 【渝粤教育】国家开放大学2018年春季 7396-21T法学基础知识 参考试题
  6. 奇怪的Adobe dynamic link
  7. 麦当劳将携手逾100所职业院校提升就业能力;百胜中国一季度开设315家新店 | 美通企业日报
  8. 解决qt.qpa.xcb: could not connect to display问题
  9. 2022年下半年软件设计师下午真题及答案解析
  10. 存在感应雷达模块,LED灯感应控制,微波雷达技术应用
  11. mybatis plus table doesn't exists
  12. ACM一年总结(写于2011年11月18日)
  13. vue中使用DataV做大屏展示
  14. 超级警探大战悍匪2java_Java笔记一
  15. 计算机网络—IP地址及其表示方法
  16. 常见PCIE X1/X4/X8/X16插槽作用与区别
  17. 【机器学习】为什么机器学习难于应用
  18. 【ospf的三类LSA sum-net】(真假ABR、区域间防环机制、vlink)
  19. MPEG4基础知识简介以及 判断MPEG4的I, P, B帧
  20. Bootstrap 框架使用

热门文章

  1. 干货|(DL~3)deep learning中一些层的介绍
  2. 基于深度学习的特征提取和匹配方法介绍
  3. 链表问题15——将搜索二叉树转换成双向链表(方法二)
  4. 链表问题11——两个单链表相交的系列问题(四):总结
  5. 第1章统计学习方法概论之1.1统计学习
  6. 【跃迁之路】【531天】程序员高效学习方法论探索系列(实验阶段288-2018.07.21)...
  7. 进阶高端,2017年vivo手机用实力说话
  8. 使用iText在word文档中插入复杂的Table表格
  9. Java Swing 树状组件JTree的使用方法【图】
  10. 【转】深入研究java.lang.Class类