题目大意

给定递推序列:

F[i] = a*F[i-1] + b (mod c)

求一个最小的i使得F[i] == t

题解

我们首先要化简这个数列,作为一个学渣,我查阅了一些资料:

http://d.g.wanfangdata.com.cn/Periodical_cczl200924107.aspx

http://wenku.baidu.com/view/7162471b650e52ea5518982d.html

推一下,就有:

\[a_{n+1}=ba_n+c\\
a_{n+1}+\frac{c}{b-1}=ba_n+c+\frac{c }{ b-1}=b(a_n+\frac{c}{b-1})\\
a_{n+1}+\frac c{b-1}=b^{n-1}(a_1+\frac c{b-1})
\]

\[F[i] = (F[1] + \frac{b}{a-1}) * a^{i-1} - \frac{b}{a-1}
\]

令F[i] = t;

可以知道:

a^(i-1) = (t+b/(a-1)) / (x1+b/(a-1))

对于这个式子,我们直接调用BSGS算法求解即可。

特别的,某些情况需要特判。

代码

  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4. ll p, a, b, X1, t, T;
  5. ll pow(ll a, ll b, ll p) {
  6. ll ans = 1;
  7. while(b) {
  8. if(b & 1) ans = ans * a % p;
  9. b >>= 1;
  10. a = a * a % p;
  11. }
  12. return ans;
  13. }
  14. ll inv(ll a, ll p) {
  15. return pow(a, p-2, p);
  16. }
  17. map<ll, ll> mp;
  18. ll BSGS(ll A, ll B, ll C) {
  19. mp.clear();
  20. if(A % C == 0) return -2;
  21. ll m = ceil(sqrt(C));
  22. ll ans;
  23. for(int i = 0; i <= m; i++) {
  24. if(i == 0) {
  25. ans = B % C;
  26. mp[ans] = i;
  27. continue;
  28. }
  29. ans = (ans * A) % C;
  30. mp[ans] = i;
  31. }
  32. ll t = pow(A, m, C);
  33. ans = t;
  34. for(int i = 1; i <= m; i++) {
  35. if(i != 1)ans = ans * t % C;
  36. if(mp.count(ans)) {
  37. int ret = i * m % C - mp[ans] % C;
  38. return (ret % C + C)%C;
  39. }
  40. }
  41. return -2;
  42. }
  43. int main() {
  44. // freopen("input", "r", stdin);
  45. scanf("%lld", &T);
  46. while(T--) {
  47. scanf("%lld %lld %lld %lld %lld", &p, &a, &b, &X1, &t);
  48. if(X1 == t) {
  49. printf("%d\n", 1);
  50. continue;
  51. }
  52. if(a == 0) {
  53. if(t == b) {
  54. printf("%d\n", 2);
  55. }
  56. else printf("%d\n", -1);
  57. continue;
  58. }
  59. if(a == 1) {
  60. if(b == 0) {
  61. printf("%d\n", -1);
  62. continue;
  63. }
  64. ll ans = (((t-X1)%p + p)%p * inv(b, p)) % p;
  65. printf("%lld\n", ans+1);
  66. continue;
  67. }
  68. X1 %= p, a %= p, b %= p, t%= p;
  69. ll tmp = (b%p * inv(a-1, p))%p;
  70. ll B = ((t+tmp)%p * inv((X1+tmp) % p, p)) % p;
  71. ll A = a;
  72. ll ans = BSGS(A, B, p);
  73. printf("%lld\n", ans+1);
  74. }
  75. return 0;
  76. }

[bzoj3122][SDOI2013]随机数生成器 ——BSGS,数列的更多相关文章

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

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

  2. bzoj3122 [SDOI2013]随机数生成器

    bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...

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

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

  4. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

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

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

  6. BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】

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

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

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

  8. bzoj千题计划259:bzoj3122: [Sdoi2013]随机数生成器

    http://www.lydsy.com/JudgeOnline/problem.php?id=3122 等比数列求和公式+BSGS #include<map> #include<c ...

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

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

随机推荐

  1. php解决sql_server连接问题

    1.首先根据phpinfo()查看当前php版本以及线程安全情况(ts或者nts):2.下载sqlsrv扩展(适用32位php) 下载链接为https://www.microsoft.com/en-u ...

  2. hive 学习系列一(数据类型的定义)

    数字类型(Numeric Types) 整型 TINYINT(取值范围:-128 -- 127) SMALLINT(取值范围:-32,768 to 32,767) INT/INTEGER(取值范围: ...

  3. TouTiao开源项目 分析笔记3

    1.搭建NewsTabLayout片段 1.1.加载布局 @Nullable @Override public View onCreateView(LayoutInflater inflater, @ ...

  4. PHP.33-TP框架商城应用实例-后台9-商品相册-修改、删除(AJAX)

    商品相册图片删除 当商品删除时,把相册中的图片一并从硬盘和数据库中删除,根据商品id[因为每一张商品相片都会生成三张缩略图,所以删除时要将其缩略图一并删除] //钩子方法_before_delete: ...

  5. P1783 海滩防御

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  6. PowerCmd

    今天在手机上看慕课网,看到一个好玩的东西.Powercmd. 一开始的感觉是,妈的,我会cmd命令,为什么要用你的cmd? 后来,用了之后,感觉,嗯,还是Powercmd好用.功能强大. 我们来看看它 ...

  7. java身份证计算年龄

    技术交流群: 233513714 /** * 根据身份证计算年龄 * * @param idcard * @return */ public static Integer idCardToAge(St ...

  8. 有关ViewPager的使用及解决Android下ViewPager和PagerAdapter中调用notifyDataSetChanged失效的问题

    ViewPager是android-support-v4.jar包中的一个系统控件,继承自ViewGroup,专门用以实现左右滑动切换View的效果,使用时需要首先在Project->prope ...

  9. @property后面可以有哪些修饰符?

    原子性---nonatomic特质 如果不写默认情况为atomic(系统会自动加上同步锁,影响性能) 在iOS开发中尽量指定为nonatomic,这样有助于提高程序的性能 读/写权限---readwr ...

  10. druid sqlparser使用例子

    package com.alibaba.druid.bvt.sql.mysql; import java.util.List; import org.junit.Assert; import com. ...