【bzoj3122】 Sdoi2013—随机数生成器
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—随机数生成器的更多相关文章
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
- bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...
- [bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列
题目大意 给定递推序列: F[i] = a*F[i-1] + b (mod c) 求一个最小的i使得F[i] == t 题解 我们首先要化简这个数列,作为一个学渣,我查阅了一些资料: http://d ...
- BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】
题目 输入格式 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 输出 ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- 【bzoj3122】: [Sdoi2013]随机数生成器 数论-BSGS
[bzoj3122]: [Sdoi2013]随机数生成器 当a>=2 化简得 然后 BSGS 求解 其他的特判 : 当 x=t n=1 当 a=1 当 a=0 判断b==t /* http: ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 洛咕 P3306 [SDOI2013]随机数生成器
洛咕 P3306 [SDOI2013]随机数生成器 大力推式子??? \(X_{i}=\underbrace{a(a(\cdots(a(a}_{i-1个a}X_1+b)))\cdots)\) \(=b ...
随机推荐
- Java中final与 static final 修饰的常量的区别
喵喵开车,新手上路,多多关照.有任何错误请在评论区指出. ...........................................我是万恶的分界线( • ̀ω•́ )✧......... ...
- .NET处理Json的几种方式
序列化里的xml,soap,binary在上一篇文章里面已经说过了,这篇主要说json. json是目前非常流行的一种序列化数据的方式,很多api都采用的是json,结构简洁,容易理解,适用性强,逐渐 ...
- 基于openvswitch+Docker构建SDN网络测试环境 (使用ovs-docker进行构建)
这是一篇之前写的笔记,主要记录了使用openvswitch + Docker 等进行一个小型的SDN网络搭建的操作步骤.由于 之前临时有其他任务,耽搁了一下,最近开始重新整理,并计划开发一个简单的Py ...
- Hyperledger Fabric MSP Identity Validity Rules——MSP身份验证规则
MSP Identity Validity Rules——MSP身份验证规则 正如Hyperledger Fabric Membership Service Providers (MSP)——成员服务 ...
- Linux-C语言标准输入输出
标准 I/O 库(stdio)及其头文件 stdio.h 为底层 I/O 系统调用提供了一个通用的接口.这个库现在已经成为 ANSI 标准 C 的一部分.标准 I/O 库提供了许多复杂的函数用于格式化 ...
- 理解粒子滤波(particle filter)
1)初始化阶段-提取跟踪目标特征 该阶段要人工指定跟踪目标,程序计算跟踪目标的特征,比如可以采用目标的颜色特征.具体到Rob Hess的代码,开始时需要人工用鼠标拖动出一个跟踪区域,然后程序自动计算该 ...
- (第九周)Beta-1阶段成员贡献分
项目名:食物链教学工具 组名:奋斗吧兄弟 组长:黄兴 组员:李俞寰.杜桥.栾骄阳.王东涵 个人贡献分=基础分+表现分 基础分=5*5*0.5/5=2.5 成员得分如下: 成员 基础分 表现分 个人贡献 ...
- Chapter 7 面向对象分析
面向对象的分析模型由功能模型.分析对象模型.动态模型三个独立的模型组成,从软件的需求功能来看分析类可以划分为实体类.边界类和控制类三种类型.识别分析类.控制类和实体类需要充分理解系统内部的行为.一个参 ...
- 第三次作业---excel导入数据库及显示
好吧首先承认这次作业失败了,而且我并不知道原因.另外,我也没有采用PowerDesigner 设计所需要的数据库,代码就用了全部的时间.感觉自己就像一个刚学会爬着走路的小孩去参加一百一十米跨栏,能不能 ...
- 第一个spring冲刺总结
讨论成员:罗凯旋.罗林杰.吴伟锋.黎文衷 第一阶段总体是做到了运算的功能,只是一些基本的功能实现,包括APP进入动画,以及界面的基本效果设计,还有核心算法已经实现(可以计算括号 乘除法等等)“: 燃尽 ...