3122: [Sdoi2013]随机数生成器

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 1442  Solved: 552

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

【分析】

  这题简直坑爹到家了!!p是质数不说,还有各种恶心特判!!!!

  a=0,a=1,b=0都要特判。

  虽说自己推出了通项公式,但是哪里的除法可以逆元哪里不可以都不知道,一开始通分各种wa!!

  看别人的题解吧:

已知xn=a*xn-1+b%p,求最小的n令xn=t

首先,若x1=t,则返回1

若a=0,则若b=t 返回2,否则无解

若a=1,则T=t-x1+p%p,可以列出方程

b*x+p*y==T % p

若a>=2,则根据等比数列和可得

xn=t=x1*a^(n-1)+b*(a^(n-1)-1)/(a-1) %p

由于p为质数,所以令c=inv[a-1]=(a-1)^(p-2)

x1*a^(n-1)+b*c*(a^(n-1))==b*c+t %p

(x1+b*c)*(a^(n-1))==b*c+t % p

令A=x1+b*c,B=p,C=b*c+t

则就是解A*X+B*Y==C %p

解出来X=a^(n-1),然后这个用BSGS求就可以了

http://www.cnblogs.com/qzqzgfy/p/5581955.html

我的代码:

  1. #include<cstdio>
  2. #include<cstdlib>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<cmath>
  8. using namespace std;
  9. #define LL long long
  10. #define Maxn 35000
  11.  
  12. struct node
  13. {
  14. LL id,val;
  15. }t[Maxn];
  16.  
  17. LL ax,ay;
  18. LL exgcd(LL a,LL b)
  19. {
  20. if(b==) {ax=;ay=;return a;}
  21. LL g=exgcd(b,a%b);
  22. LL xx=ax;
  23. ax=ay;ay=xx-(a/b)*ay;
  24. return g;
  25. }
  26.  
  27. bool cmp(node x,node y) {return (x.val==y.val)?(x.id<y.id):(x.val<y.val);}
  28.  
  29. LL cnt;
  30.  
  31. LL t_div(LL x)
  32. {
  33. LL l=,r=cnt;
  34. while(l<r)
  35. {
  36. LL mid=(l+r)>>;
  37. if(t[mid].val==x) return t[mid].id;
  38. if(t[mid].val>x) r=mid-;
  39. else l=mid+;
  40. }
  41. if(t[l].val==x) return t[l].id;
  42. return -;
  43. }
  44.  
  45. LL get_ans(LL k,LL a,LL c,LL p)
  46. {
  47. LL sq=(LL)ceil(sqrt((double)p));
  48. t[].id=;t[].val=k%p;
  49. for(LL i=;i<=sq;i++) t[i].val=(t[i-].val*a)%p,t[i].id=i;
  50.  
  51. sort(t+,t++sq,cmp);
  52. cnt=;
  53. for(LL i=;i<=sq;i++) if(t[i].val!=t[i-].val) t[++cnt]=t[i];
  54.  
  55. LL bm=;
  56. for(LL i=;i<=sq;i++) bm=(bm*a)%p;
  57. LL g=exgcd(bm,p);
  58. ax=(ax%(p/g)+(p/g))%(p/g);
  59. bm=ax;
  60.  
  61. LL tmp=c%p;
  62. for(LL i=;i<=sq;i++)
  63. {
  64. LL now=t_div(tmp);
  65. if(now!=-) return now+i*sq;
  66. tmp=(tmp*bm)%p;
  67. }
  68. return -;
  69. }
  70.  
  71. LL ffind(LL k,LL a,LL c,LL p)
  72. {
  73. LL x=k;
  74. for(LL i=;i<=;i++)
  75. {
  76. if(x==c) return i;
  77. x=(x*a)%p;
  78. }
  79. LL g;
  80. x=;
  81. while((g=exgcd(a,p))!=)
  82. {
  83. p/=g;
  84. k=(k*(a/g))%p;
  85. if(c%g!=) return -;
  86. c/=g;
  87. x++;
  88. }
  89. LL ans=get_ans(k,a,c,p);
  90. if(ans==-) return -;
  91. return ans+x;
  92. }
  93.  
  94. int main()
  95. {
  96. int T,kase=;
  97. scanf("%d",&T);
  98. while(T--)
  99. {
  100. // printf("%d: ",++kase);
  101. LL p,a,b,x,t,c;
  102. scanf("%lld%lld%lld%lld%lld",&p,&a,&b,&x,&t);
  103. // if(b==0) {printf("1\n");continue;}
  104. if(t==x) {printf("1\n");continue;}
  105. if(a==&&b==t) {printf("2\n");continue;}
  106. else if(a==) {printf("-1\n");continue;}
  107. if(a==)
  108. {
  109. LL g=exgcd(b,p);
  110. c=t-x;c=(c%p+p)%p;
  111. if(c%g!=) {printf("-1\n");continue;}
  112. ax*=c/g;
  113. ax=(ax%(p/g)+(p/g))%(p/g);
  114. printf("%d\n",ax+);
  115. continue;
  116. }
  117.  
  118. LL phi;
  119. if(b%(a-)==) phi=b/(a-);
  120. else
  121. {
  122. if(exgcd(a-,p)!=) {printf("-1\n");continue;}
  123. ax=(ax%p+p)%p;
  124. phi=(b*ax)%p;
  125. }
  126. LL A=x+phi,B=phi+t;
  127.  
  128. if(b==) A=x,B=t;
  129.  
  130. A=(A%p+p)%p; B=(B%p+p)%p;
  131. // if(A==0) {printf("-1\n");continue;}
  132.  
  133. LL ans=ffind(A,a,B,p);
  134.  
  135. if(ans==-) printf("-1\n");
  136. else printf("%lld\n",ans+);
  137. }
  138. return ;
  139. }

BZOJ 3211

2016-09-05 18:24:44

【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)的更多相关文章

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

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

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

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

  3. bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)

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

  4. bzoj 3122: [Sdoi2013]随机数生成器【BSGS】

    题目要求的是: \[ ...a(a(a(ax+b)+b)+b)+b...=a^nx+a^{n-1}b+a^{n-2}b+...+b\equiv t(mod\ p) \] 后面这一大坨看着不舒服,所以考 ...

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

    #include<cstdio> #include<iostream> #include<map> #include<cmath> #define ll ...

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

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

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

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

  8. 【bzoj3122】[Sdoi2013]随机数生成器 BSGS思想的利用

    题目描述 给出递推公式 $x_{i+1}=(ax_i+b)\mod p$ 中的 $p$.$a$.$b$.$x_1$ ,其中 $p$ 是质数.输入 $t$ ,求最小的 $n$ ,使得 $x_n=t$ . ...

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

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

随机推荐

  1. I2C Verilog的实现(一)

    <span style="font-size:14px;">`timescale 1ns / 1ps module test( sda ); reg scl; inou ...

  2. "只能在执行Render()的过程中调用RegisterForEventValidation" 解决方案

    开发中遇到令人蛋疼的问题: 只能在执行Render()的过程中调用RegisterForEventValidation 当出现的异常的提示: 异常详细信息: System.InvalidOperati ...

  3. jquery click事件的可选参数data的作用

    $("#ID").click({x:"value"},function (e) { alert(e.data.x); });

  4. 实现View弹性滑动例子

    弹性滑动原理 将一次大的滑动非为若干次小的滑动,并在一个时间段内完成.有一种顺畅的感觉更-好的用户体验 实现方式很多种,包括用Scroller.动画.延时策略. 使用Handler实现弹性滑动 效果可 ...

  5. JS中的replace方法以及与正则表达式的结合应用

    replace方法的语法是:stringobj.replace(rgexp, replacetext) 其中stringobj是字符串(string),reexp可以是正则表达式对象(regexp)也 ...

  6. 100个iOS开发面试题汇总-王刚韧的技术博客

    100个iOS开发面试题汇总 关于iOS开发面试,不管对于招聘和应聘来说,面试都是很重要的一个环节,特别对于开发者来说,面试中的技术问题环节不仅是企业对应聘者技能和积累的考察,也是一个开发者自我检验的 ...

  7. js生成动态日历

    效果图:   看代码: <html> <head> <title>动态日历</title> <style type="text/css& ...

  8. MyEclipse 多项目对应配置多个Tomcat

    在MyEclipse的安装目录下,有D:\Program Files\MyEclipse 6.5\myeclipse\eclipse\plugins 的插件路径. 里边很多插件的配置文件包.   找到 ...

  9. P1832 A+B Problem(再升级)

    P1832 A+B Problem(再升级) 题目提供者 usqwedf 传送门 标签 动态规划 数论(数学相关) 洛谷原创 难度 普及/提高- 通过/提交 107/202 题目背景 ·题目名称是吸引 ...

  10. DataReader 和 DataSet 的区别

    摘自:http://www.cnblogs.com/zhjjNo1/archive/2009/08/26/1554420.html 第一种解释 DataReader和DataSet最大的区别在于,Da ...