3211. 【SDOI2013】随机数生成器
Description
小 W喜欢读 书,尤其喜欢读 书,尤其喜欢读《约翰克里斯 朵夫》。 最近小 W准备读一本新书,这本一共有 p页, 页码范围为 0..p -1。
小 W很忙,所以每天只能读一页书 。为了使事情有趣一些 ,他打算使用 NOI2012上学习的线性同余法生成 一个序列 ,来决定每天具体读哪一页 。
我们用 Xi来表示通过这种方法生成出来第 i个数 ,也即小 W第 i天会读 哪一页 。这个方法 需要设置 3个参数 a,b,X1,满足 0≤a,b,X1≤p-1,且 a, b,X1都是整数 。按照下面的公式 按照下面的公式生成出来一系列的 整数。
Xi+1= (aXi + b) mod p
其中 mod p 表示前面的数除以 p的余数。
可以发现,这个序列中下一个数总是由上一个数生成的 ,而且每一项都在 0..p -1这个范围内 ,是一个合法的页码。 同时需要注意 ,这种方法有可能导致某两天读的页码完全一样 。
小 W非常急切 地想去读这本书的第t页。所以他想知道, 对于一组给定的 a, b,X1,如果使用线性同余法来生成每一天读的页码, 最早读到第t页是在哪一天,或者指出他永远不会读到第t页。
Input
输入含有多组数据 ,第一行一个正整数T,表示这个测试点内的数据组数。
接下来 T行,每行有 五个整数 p,a,b,X1,t,表示一组数据。 保证 X1和 t都是合法的页码。
Output
共 T行,每行一个整数表示他最早读到第t页是哪一天 。如果他永远不会读到第t页,输出 -1。
Sample Input
37 1 1 3 37 2 2 2 07 2 2 2 1
Sample Output
13-1
Data Constraint
Hint
对于第一组数据,生成的序列为: 3,4,5,6,0…
对于第二 、三 组数据, 生成的序列为: 2,6,0,2…
Solution
BSGS。
套等差数列公式
现在已知x的第n+1项为t(即),求n+1的最小值
对于分母求逆元,对于整个式子BSGS
总结:注意同一个变量不能多用,多开几个变量就好了。同时对于每个相同或相似的过程最好统一一下变量名。
Code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define M 70921
using namespace std;
I T,p,a,b,x,t,m,now,ans,inf=0x7fffffff;
struct node{I v,c;}h[M+10];
void R(I &x){I w=1;x=0;char c=getchar();while(c<'0'||c>'9'){if(c=='-') w=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}x*=w;
}
I ksm(ll x,I k){ll sum=1;while(k){if(k&1) sum=(sum*x)%p;x=(x*x)%p;k>>=1;}return sum;
}
I hash(I x){I k=x%M;while(h[k].v>=0&&h[k].v!=x) if(++k==M) k=0;return k;
}
I main(){freopen("generator.in","r",stdin);freopen("generator.out","w",stdout);R(T);while(T--){ans=inf;R(p),R(a),R(b),R(x),R(t);if(x==t){printf("1\n");continue;}if(x==0&&b==0){printf("-1\n");continue;}if(a==0){printf(b==t?"2\n":"-1\n");continue;}if(a==1){if(!b){printf("-1\n");continue;}now=(ll)(t-x+p)%p*ksm(b,p-2)%p;printf("%d\n",now+1);continue;}memset(h,255,sizeof h);t=((1LL*t*a-t+b)%p+p)%p*ksm(((1LL*x*a-x+b)%p+p)%p,p-2)%p;m=sqrt(p);F(j,1,m){x=hash(t=1LL*t*a%p);h[x]=node{t,j};}now=ksm(a,m);x=1;F(i,1,m+1){t=hash(x=1LL*x*now%p);if(h[t].c>=0) ans=min(ans,i*m-h[t].c+1);} printf((ans==inf)?"-1\n":"%d\n",ans);}return 0;
}
3211. 【SDOI2013】随机数生成器相关推荐
- luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
- bzoj3122 [Sdoi2013]随机数生成器(bsgs+扩欧+数列)
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意 ...
- 【bzoj3122】 Sdoi2013—随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 (题目链接) 题意 对于一个数列${X_i}$,其递推式为:${X_{i+1}=(a*X_i+ ...
- bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...
- 牛客——[SDOI2013]随机数生成器(推公式+BSGS)
链接:https://ac.nowcoder.com/acm/problem/20362 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 数论练习二之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 ...
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...
- 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器 本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...
- P5147 随机数生成器 [数列]
P5147 随机数生成器 数学老师看不懂系列 看题目这一片代码就很晕: int work(int x) {if(x==1)return 0;else return work(rand(1,x))+1; ...
最新文章
- 谷歌发布史上最强人类大脑「地图」,1.3亿个突触,在线可视3D神经元「森林」!...
- jquery遍历table
- 类 Class 对象、定义、方法
- NgModule中的声明,提供程序和导入有什么区别?
- MySQL、Oracle、SQL Server
- norm--求矩阵和向量的范数
- 关于如如何运行tensorrt
- 因子分解机 Factorization Machine python 源码
- Problem G: 函数---判断日期(年月日)是否合法
- JsonView插件的使用
- 面试题31:连续子数组的最大和
- React封装多个日期段组件--BatchDate组件
- java下cmyk图片读取和转换rgb,以及图片压缩
- 【好文】敏捷中国十八年目睹之怪现状
- Python爬取上交所年报下载并转成TXT
- Filebeat自定义index和fields
- Python链家租房信息爬虫
- 智能客服搭建(1) - MRCP Server 搭建
- flv怎么转换成mp4格式?
- 数字化转型 — 新能源汽车 — 生产制造流程 — 总装车间