【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器
Time Limit: 10 Sec Memory Limit: 256 MB
Submit:
1362 Solved: 531
[Submit][Status][Discuss]
Description
.jpg)
Input
输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。
接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。
注意:P一定为质数
Output
共T行,每行一个整数表示他最早读到第t页是哪一天。如果他永远不会读到第t页,输出-1。
Sample Input
7 1 1 3 3
7 2 2 2 0
7 2 2
2 1
Sample Output
3
-1
HINT
0<=a<=P-1,0<=b<=P-1,2<=P<=10^9
Source
Solution
不错的题
对于题目中给出的式子,我们尝试的得出$X_{n}$关于$X_{1}$的式子
显然暴力带是不能得到的,考虑对原始式子进行变形:首先同余方程式左右是可以同时+—*/的毫无问题,那么我们对式子如下变化:
$X_{i+1}\equiv aX_{i}+b (mod p)$
==>$X_{i+1}+\frac{b}{a-1}\equiv aX_{i}+b+\frac{b}{a-1} (mod p)$
==>$X_{i+1}+\frac{b}{a-1}\equiv a(X_{i}+\frac{b}{a-1}) (mod p)$
那么我们显然能够用$X_{1}$表示$X_{n}$,层层带入得
$X_{n}+\frac{b}{a-1}\equiv a^{n-1}(X_{1}+\frac{b}{a-1}) (mod p)$
然后在模意义下,我们使用逆元计算,这样的话,利用BSGS算法求解即可
这里有些需要特判掉的情况:
1° $X_{1}=t$ 显然ans=1
2° $a==0$ 显然得到$X_{n}\equiv b(mod p)$ 那么$b=t$时 ans=2 否则 ans=-1
3° $a==1$ 显然得到$X_{n}\equiv X_{1}+(n-1)b(mod p)$ 这样显然可以用ExGCD求解
Code
(感觉这是这道题最短的代码了2333)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
long long read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-'';ch=getchar();}
return (long long)x*f;
}
int T;
long long p;
long long Quick_Pow(long long x,long long y,long long p)
{
long long re=;
for (int i=y; i; i>>=,x=x*x%p)
if (i&) re=re*x%p;
return re;
}
long long BSGS(long long a,long long b,long long p)
{
long long m=ceil(sqrt(p)),t=;
map<long long,long long>hash;
for (int i=; i<=m; i++,b=b*a%p) hash[b]=i;
long long f=Quick_Pow(a,m,p);
for (long long i=; i<=m; i++)
if (t=t*f%p,hash.count(t)) return i*m-hash[t]+;
return -;
}
int main()
{
T=read();
while (T--)
{
long long a,b,X1,t;
p=read(),a=read(),b=read(),X1=read(),t=read();
if (X1==t) {puts(""); continue;}
if (a==) {if (t==b) puts(""); else puts("-1"); continue;}
if (a==) {if (!b) puts("-1"); else printf("%lld\n",((((t-X1+p)%p)*Quick_Pow(b,p-,p)%p)%p)+); continue;}
long long aa=Quick_Pow(a-,p-,p),t1=b*aa%p,t2=(X1%p+t1)%p,tt=Quick_Pow(t2,p-,p),t3=(t+t1)%p;
printf("%lld\n",BSGS(a,t3*tt%p,p));
}
return ;
}
【BZOJ-3122】随机数生成器 BSGS的更多相关文章
- bzoj 3122 随机数生成器 - BSGS
Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...
- BZOJ 3122 随机数生成器
http://www.lydsy.com/JudgeOnline/problem.php?id=3122 题意:给出p,a,b,x1,t 已知xn=a*xn-1+b%p,求最小的n令xn=t 首先,若 ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- 【BZOJ3122】[Sdoi2013]随机数生成器 BSGS+exgcd+特判
[BZOJ3122][Sdoi2013]随机数生成器 Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b, ...
- bzoj 3122 : [Sdoi2013]随机数生成器 BSGS
BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...
- Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)
Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数. 接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. 注意:P一定为质数 Outp ...
- BZOJ3122 随机数生成器——BSGS
题意 链接 给定 $p,\ a,\ b, \ x_1$,现有一数列 $$x_{i+1} \equiv (ax_i + b) \ mod \ p$$ 求最小的 $i$ 满足 $x_i = t$ 分析 代 ...
- [BZOJ]3671 随机数生成器(Noi2014)
洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...
- BZOJ3122: [Sdoi2013]随机数生成器(BSGS)
题意 题目链接 Sol 这题也比较休闲. 直接把\(X_{i+1} = (aX_i + b) \pmod P\)展开,推到最后会得到这么个玩意儿 \[ a^{i-1} (x_1 + \frac{b}{ ...
随机推荐
- 十个节省时间的MySQL命令
十个节省时间的MySQL命令 2011-02-23 16:07 黄永兵 译 IT168 字号:T | T 编者在工作中积累起来了一些MySQL命令行客户端技巧,这些技巧或多或少会帮助您节省大量的时间. ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 标准省市县数据的公司选择窗口实现
若全国各地有上千个分公司,加盟店,网点,那就需要一个友善的选择分公司的功能,得有标准的全国省市县的划分数据.这样有了牢靠的基础数据后,才能开发程序得心应手了.当习惯了开发一个公司内部系统时,全国性大公 ...
- JS对异步循环使用递归
场景:有一个函数接收一个URL的数组,要求依次下载每个文件直到所有文件被成功下载. 如果API是同步的,很容易使用一个循环来实现 var downloadAllSync = function(urls ...
- sql server利用开窗函数over() 进行分组统计
这是一道常见的面试题,在实际项目中经常会用到. 需求:求出以产品类别为分组,各个分组里价格最高的产品信息. 实现过程如下: declare @t table( ProductID int, Produ ...
- js 数组去重
这是一道常见的面试题,最近在做[搜索历史记录]功能也用到,开始用了 indexOf 方法,该方法在 ECMA5才有支持,对于 IE8- 就不支持了. 我们可以自己写一个函数(Array对象的方法都是定 ...
- Tomcat 内存溢出对应解决方式
1.Tomcat内存溢出的原因 生产环境中Tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三 ...
- Theano2.1.15-基础知识之theano如何处理shapre信息
来自:http://deeplearning.net/software/theano/tutorial/shape_info.html How Shape Information is Handled ...
- 闲扯 『 document.write 』
初春的晚上,闲来无事,聊聊 document.write 方法. document.write 使用方式非常简单,把 "字符串化"(不好意思,这可能是我自己创造的名词)的 html ...
- SQL基础之GROUPING
1.grouping sets 记得前几天第一次接触grouping sets时,笔者的感觉是一脸懵逼. 后来一不小心看到msdn上对grouping sets的说明,顿时豁然开朗,其实groupin ...
- JAVA_集合框架虐我千百遍,虐也是一种进步
1.Collection和Collections区别: Collection是java的一个集合接口,集合类的顶级接口 Collections是一个包装类(工具类),不能被实例化(由于其构造函数设为私 ...