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出来的解是-1
if (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;
}

  

【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)

    题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...

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

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

  4. [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列

    题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...

  5. BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】

    题目 输入格式 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 输出 ...

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

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

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

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

  8. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

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

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

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

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

随机推荐

  1. CHAPTER 8 Out of Darkness 第8章 走出黑暗

    CHAPTER 8 Out of Darkness 第8章 走出黑暗 We expect scientists to be trying to discover new things, and for ...

  2. XML学习(一)

    实体引用 在 XML 中,一些字符拥有特殊的意义. 如果您把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始. 这样会产生 XML 错误: ...

  3. STUN, TURN, ICE介绍

    STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的.STUN协议是典型的Client-Server协议,各种具体应用通过嵌 ...

  4. 如何快速搭建yum源

    yum命令能够从指定的服务器自动下载rpm包并安装,它最强大的地方就是可以自动处理软件包的依赖关系,能够一次安装所有依赖的关系包.下面将通过虚拟机平台介绍两种快速搭建yum源的方法: 一.有网络的情况 ...

  5. https、ssl、tls协议学习

    一.知识准备 1.ssl协议:通过认证.数字签名确保完整性:使用加密确保私密性:确保客户端和服务器之间的通讯安全 2.tls协议:在SSL的基础上新增了诸多的功能,它们之间协议工作方式一样 3.htt ...

  6. Linux 文件系统 -- 简述几种文件类型

    Linux 中一切皆为文件,文件类型也有多种,使用 ls -l 命令可以查看文件的属性,所显示结果的第一列的第一个字符用来表明该文件的文件类型,如下: 1.普通文件 使用 ls -l 命令后,第一列第 ...

  7. Codeforces70 | Codeforces Beta Round #64 | 瞎讲报告

    目录 前言 正文 A B C D E 前言 这个毒瘤的517 放了Div1 然后D题是昨天讲的动态凸包(啊喂!我还没来的及去写 结果自己想的是二分凸包 (当然没有写出来 写完前两题之后就愉快地弃疗 C ...

  8. Visual Studio AI配置环境

    参考链接:http://www.cnblogs.com/ms-uap/p/9123033.html 背景: 1.能联网的电脑:Win7 64 SP1 2.鼠标.键盘.显示器好使 3.已安装VS2010 ...

  9. 28_数据库_第28天(数据库、表及表数据、SQL语句)_讲义

    今日内容介绍 1.MySQL数据库 2.SQL语句 01数据库概念 A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来, 用户可以对数据库中的数据进行 ...

  10. ubuntu中启动VIM,以及学习VIM

    启动VIM:首先打开终端,然后输入vi回车,然后输入i或者a,进入. 学习VIM:首先打开终端,然后输入vimtutor回车,然后进入教程学习.