3122: [Sdoi2013]随机数生成器

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit:
1362  Solved: 531
[Submit][Status][Discuss]

Description

Input

输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数。 

 
接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据。保证X1和t都是合法的页码。

注意:P一定为质数

Output

共T行,每行一个整数表示他最早读到第t页是哪一天。如果他永远不会读到第t页,输出-1。

Sample Input

3
7 1 1 3 3
7 2 2 2 0
7 2 2
2 1

Sample Output

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

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<map>
  7. using namespace std;
  8. long long read()
  9. {
  10. int x=,f=; char ch=getchar();
  11. while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
  12. while (ch>='' && ch<='') {x=x*+ch-'';ch=getchar();}
  13. return (long long)x*f;
  14. }
  15. int T;
  16. long long p;
  17. long long Quick_Pow(long long x,long long y,long long p)
  18. {
  19. long long re=;
  20. for (int i=y; i; i>>=,x=x*x%p)
  21. if (i&) re=re*x%p;
  22. return re;
  23. }
  24. long long BSGS(long long a,long long b,long long p)
  25. {
  26. long long m=ceil(sqrt(p)),t=;
  27. map<long long,long long>hash;
  28. for (int i=; i<=m; i++,b=b*a%p) hash[b]=i;
  29. long long f=Quick_Pow(a,m,p);
  30. for (long long i=; i<=m; i++)
  31. if (t=t*f%p,hash.count(t)) return i*m-hash[t]+;
  32. return -;
  33. }
  34. int main()
  35. {
  36. T=read();
  37. while (T--)
  38. {
  39. long long a,b,X1,t;
  40. p=read(),a=read(),b=read(),X1=read(),t=read();
  41. if (X1==t) {puts(""); continue;}
  42. if (a==) {if (t==b) puts(""); else puts("-1"); continue;}
  43. if (a==) {if (!b) puts("-1"); else printf("%lld\n",((((t-X1+p)%p)*Quick_Pow(b,p-,p)%p)%p)+); continue;}
  44. 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;
  45. printf("%lld\n",BSGS(a,t3*tt%p,p));
  46. }
  47. return ;
  48. }

【BZOJ-3122】随机数生成器 BSGS的更多相关文章

  1. bzoj 3122 随机数生成器 - BSGS

    Description Input 输入含有多组数据,第一行一个正整数T,表示这个测试点内的数据组数.   接下来T行,每行有五个整数p,a,b,X1,t,表示一组数据.保证X1和t都是合法的页码. ...

  2. 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 首先,若 ...

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

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

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

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

  5. bzoj 3122 : [Sdoi2013]随机数生成器 BSGS

    BSGS算法 转自:http://blog.csdn.net/clove_unique 问题 给定a,b,p,求最小的非负整数x,满足$a^x≡b(mod \ p)$ 题解 这就是经典的BSGS算法, ...

  6. Bzoj 3122 [Sdoi2013]随机数生成器(BSGS+exgcd)

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

  7. BZOJ3122 随机数生成器——BSGS

    题意 链接 给定 $p,\ a,\ b, \ x_1$,现有一数列 $$x_{i+1} \equiv (ax_i + b) \ mod \ p$$ 求最小的 $i$ 满足 $x_i = t$ 分析 代 ...

  8. [BZOJ]3671 随机数生成器(Noi2014)

    洛谷上卡不过去的朋友们可以来看看小C的程序(小C才不是标题党呢!) Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子 ...

  9. BZOJ3122: [Sdoi2013]随机数生成器(BSGS)

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

随机推荐

  1. mac上如何卸载oracle jdk 1.7

    目前mac上有一些软件还不支持jdk1.7,只能卸载1.7,恢复到1.6,下面二个链接是官网给出的卸载方法: http://www.java.com/zh_CN/download/help/mac_u ...

  2. jboss:跟踪所有sql语句及sql参数

    默认情况下,hibernate/JPA 在server.log中记录的SQL语句,参数都是用?代替的,这样不太方便. 网上留传的p6spy在最新的jboss上(EAP 6.0+版本)貌似已经不起作用了 ...

  3. ubuntu13.04环境hadoop1.2.1单机模式安装

    一.虚拟机上安裝ubuntun 13.04 中文版 当然,你要是习惯看英文版,也可以直接安装英文版.老老实实从官网下载安装即可,安装系统不是本文的重点.这里只提一个注意事项:新手安装前,切记断网,因为 ...

  4. flask+sqlite3+echarts2+ajax数据可视化--静态图

    结构: /www | |-- /static | | | |-- echarts.js(当然还有echarts原dist目录下的文件(夹)) | |-- /templates | | | |-- in ...

  5. Windows 8的本地化应用程序清单

    I need to localize some data in application manifest (like name, description, splashscreen images et ...

  6. Qt学习笔记 TableWidget使用说明和增删改操作的实现

    看一下效果很简单的一个小功能 先说分部讲一下过程 再给出详细代码 添加数据 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...

  7. C#链接阿里云OCS

    一.阿里云OCS简单介绍 阿里云OCS兼容Memcached,因为OCS就相当于Memcached的服务器端,我们代码只是当作客户端,链接上服务器端就行了.阿里云OCS介绍详情见 http://www ...

  8. 综合使用spring cloud技术实现微服务应用

    在之前的章节,我们已经实现了配置服务器.注册服务器.微服务服务端,实现了服务注册与发现.这一章将实现微服务的客户端,以及联调.实现整个spring cloud框架核心应用. 本文属于<7天学会s ...

  9. java swing模仿随机频谱

    import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Grap ...

  10. Vware Workstation pro 12|虚拟机

    Vmware是比较不错的PC虚拟化软件,vmware11+不在支持32的系统安装!体积比之前小了很多 VMware 12 官方中文页面 http://vmware.com/cn/products/wo ...