http://www.lydsy.com/JudgeOnline/problem.php?id=3122 (题目链接)

题意

  对于一个数列${X_i}$,其递推式为:${X_{i+1}=(a*X_i+n)~mod~P}$,求最小的${i}$满足${X_i=t}$。

Solution

  大家还记得数学中数列那一章吗,那么推倒这个数列的方法一定是老师重点强调过的:

$${X_{i+1}+λ=a*(X_i+λ)}$$

$${可以算出λ=\frac{b}{a-1}}$$

$${令B_i=X_i+\frac{b}{a-1}}$$

$${则B_{i+1}=a*B_i,为等比数列}$$

$${B_i=B_1*a^{i-1}}$$

$${B_i=(X_1+\frac{b}{a-1})*a^{i-1}}$$

$${\because B_i=X_i+\frac{b}{a-1}}$$

$${\therefore X_i=(X_1+\frac{b}{a-1})*a^{i-1}-\frac{b}{a-1}}$$

$${令c=(a-1)^{-1}~(mod~p)}$$

$${则X_i=(X_1+b*c)*a^{i-1}+b*c~~(mod~p)}$$

$${即求(X_1+b*c)*a^{i-1}≡t-b*c~~(mod~p)}$$

  因为a的取值,我们需要考虑特殊情况并进行分类讨论。

  首先要特判${X_1=t}$的情况,因为这个在后面不好处理,不如讨论之前就直接排除在外。

  1.${a=0}$

  这种情况下要么是${t=X_1}$,要么是${t=X_2}$,因为${X_n=b~(n>1)}$

  2.${a=1}$

  那么数列就可以简化为:${X_{i+1}=X_i+b}$,是一个等差数列。

  即求:${X_1+b*(i-1)=t~(mod~p)}$

  这可以用exgcd求解。

  3.${a>=2}$

  那么就是我们上面推下来的式子,先用exgcd求出${a^{i-1}}$的最小正整数解,然后用BSGS计算${i-1}$的取值。

细节

  数学题就是细节多,exgcd判无解。

代码

// bzoj3122
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<map>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std;map<LL,LL> mp;LL power(LL a,LL b,LL c) {LL res=1;while (b) {if (b&1) res=res*a%c;b>>=1;a=a*a%c;}return res;
}
LL BSGS(LL a,LL b,LL p) {LL m=ceil(sqrt(p));LL inv=power(a,p-1-m,p),e=1;mp.clear();mp[1]=0;for (int i=1;i<m;i++) {e=e*a%p;if (!mp.count(e)) mp[e]=i;}for (int i=0;i<m;i++) {if (mp.count(b)) return mp[b]+i*m+1;b=b*inv%p;}return -1;
}
void exgcd(LL a,LL b,LL &d,LL &x,LL &y) {if (b==0) {d=a;x=1;y=0;return;}exgcd(b,a%b,d,y,x);y-=a/b*x;
}
int main() {LL P,A,B,X1,t;int T;scanf("%d",&T);while (T--) {scanf("%lld%lld%lld%lld%lld",&P,&A,&B,&X1,&t);      if (X1==t) {puts("1");continue;}   //一定要特判,如果进入BSGS后b为0出来的解是-1if (A==0) {if (B==t) puts("2");else puts("-1");}if (A==1) {LL x,d,y;t=(t-X1)%P;if (!t) {puts("1");continue;}exgcd(B,P,d,x,y);if (t%d!=0) {puts("-1");continue;}printf("%lld\n",((t/d)*x%(P/d)+(P/d))%(P/d)+1);}if (A>=2) {LL x,d,y;LL c=power(A-1,P-2,P);t=(t+B*c)%P;exgcd(X1+B*c,P,d,x,y);if (t%d!=0) {puts("-1");continue;}x=((t/d)*x%(P/d)+(P/d))%(P/d);printf("%lld\n",BSGS(A,x,P));}}return 0;
}

  

转载于:https://www.cnblogs.com/MashiroSky/p/6207861.html

【bzoj3122】 Sdoi2013—随机数生成器相关推荐

  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. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

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

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

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

  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. mysql自定义收藏分类_MYSQL中SHOW的使用整理收藏
  2. AI端计算产业应用:如何快速训练高精度模型并在设备端加速计算 | 公开课报名...
  3. CVPR 2016 《Object Detection from Video Tubelets with Convolutional Neural Networks》论文笔记
  4. centos eclipse 安装
  5. 7. OD-破解收费版限制天数的软件
  6. 回到顶部 jquery
  7. mysql中查询编辑器_数据库中查询编辑器的使用方法
  8. Js获取处理日期时间
  9. 广联达软件未检测到加密锁请重新插入加密锁或网络服务器
  10. 豪华酒店介绍预订网站模板,里面总共7个页面,适合酒店预订相关网站模板下载。
  11. FPGA 20个例程篇:7.FLASH读写断电存储
  12. 家用linux 版本哪个好,Ubuntu到底哪个版本最好用?
  13. 【005】基于Vue.js及相关插件的仿微博移动版的单页应用(SPA)项目(含源码、运行教程)
  14. 好记性不如烂笔头,要保持学习
  15. Android左右声道的控制
  16. 我整理了50道经典Java算法题,直接进了字节跳动!!
  17. SpringBoot集成Redis代码详解,收藏起来
  18. golang中的字符串拼接
  19. 友盟启动耗时分析之耗时趋势及性能拆解
  20. 平行四边形法则的感悟

热门文章

  1. 深度学习数据集制作_一篇文章搞定人工智能之深度学习创建训练数据集的方法
  2. 你的个人信息是如何被盗走的?MySQL脱库,脱库的原理,怎么脱库,脱库的步骤,一库三表六字段
  3. 第一章:Shiro简介
  4. 使用Electron将Web项目打包成windows桌面应用
  5. CSS浏览器兼容性的4个解决方案:浏览器CSS样式初始化、浏览器私有属性,CSS hack语法和自动化插件...
  6. python-组合数据类型
  7. JavaScript 模块化编程(二):AMD规范
  8. 类继承和初始化类的执行顺序
  9. ORACLE LATERAL-SQL-INJECTION 个人见解
  10. MySQL练习题和代码附录