题意:

已知 \(X_i = a * X_{i - 1} + b * X_{i - 2}\),现给定\(X_0,X_1,a,b\),询问\(X^n \mod p\),其中\(n <= 10^{1e6}\)

思路:

显然这道题需要用到矩阵快速幂,但是因为\(n\)是百万位级别,直接快速幂复杂度为\(1e6 * log10 * 4 * C1\),超时。

所以我们可以用十进制矩阵快速幂,和二进制类似,复杂度为\(1e6 * 4 * C2\)。因为这里的\(n\)比较大,所以\(C2 < log10 * C1\)大概率发生。

代码:

  1. #include<map>
  2. #include<set>
  3. #include<queue>
  4. #include<cmath>
  5. #include<stack>
  6. #include<ctime>
  7. #include<string>
  8. #include<vector>
  9. #include<cstdio>
  10. #include<cstring>
  11. #include<sstream>
  12. #include<iostream>
  13. #include<algorithm>
  14. using namespace std;
  15. typedef long long ll;
  16. typedef unsigned long long ull;
  17. const int maxn = 1e6 + 5;
  18. const int INF = 0x3f3f3f3f;
  19. const ull seed = 11;
  20. const int MOD = 1e9 + 7;
  21. using namespace std;
  22. char s[maxn];
  23. ll x0, x1, a, b, mod;
  24. struct Mat{
  25. ll s[2][2];
  26. void init(){
  27. for(int i = 0; i < 2; i++)
  28. for(int j = 0; j < 2; j++)
  29. s[i][j] = 0;
  30. }
  31. };
  32. inline Mat pmul(Mat a, Mat b){
  33. Mat t;
  34. t.init();
  35. for(int i = 0; i < 2; i++){
  36. for(int j = 0; j < 2; j++){
  37. for(int k = 0; k < 2; k++){
  38. t.s[i][j] = (t.s[i][j] + a.s[i][k] * b.s[k][j]) % mod;
  39. }
  40. }
  41. }
  42. return t;
  43. }
  44. inline Mat ppow(Mat a, int b){
  45. Mat ret;
  46. ret.init();
  47. for(int i = 0; i < 2; i++) ret.s[i][i] = 1;
  48. while(b){
  49. if(b & 1) ret = pmul(ret, a);
  50. a = pmul(a, a);
  51. b >>= 1;
  52. }
  53. return ret;
  54. }
  55. inline Mat power(Mat a, char *s, int n){
  56. Mat ret;
  57. ret.init();
  58. for(int i = 0; i < 2; i++) ret.s[i][i] = 1;
  59. for(int i = n; i >= 1; i--){
  60. int x = s[i] - '0';
  61. if(x) ret = pmul(ret, ppow(a, x));
  62. a = ppow(a, 10);
  63. }
  64. return ret;
  65. }
  66. int main(){
  67. scanf("%lld%lld%lld%lld", &x0, &x1, &a, &b);
  68. scanf("%s%lld", s + 1, &mod);
  69. int n = strlen(s + 1);
  70. Mat ans, t;
  71. ans.init();
  72. ans.s[0][0] = x1, ans.s[0][1] = x0;
  73. t.s[0][0] = a, t.s[0][1] = 1, t.s[1][0] = b, t.s[1][1] = 0;
  74. t = power(t, s, n);
  75. ans = pmul(ans, t);
  76. printf("%lld\n", ans.s[0][1]);
  77. return 0;
  78. }

牛客多校第五场B generator1(十进制矩阵快速幂)题解的更多相关文章

  1. generator 1(2019年牛客多校第五场B题+十进制矩阵快速幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 十进制矩阵快速幂. 代码 #include <set> #include <map> #include <deque& ...

  2. 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化

    B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...

  3. 牛客多校第五场 B generator 1 矩阵快速幂

    题意: 给定$x_0,x_1,a,b,n,mod, x_i=a*x_{i-1}+b*x_{i-2}$ ,求$x_n % mod$ n最大有1e6位 题解: 矩阵快速幂. 巨大的n并不是障碍,写一个十进 ...

  4. 2019牛客多校第五场B generator 十进制快速幂

    generator 1 题意 给出\(x_0,x_1,a,b\)已知递推式\(x_i=a*x_{i-1}+b*x_{i-2}\),出个n和mod,求\(x_n\) (n特别大) 分析 比赛的时候失了智 ...

  5. 2019牛客多校第五场C generator 2(BSGS)题解

    题意: 传送门 已知递推公式\(x_i = a*x_{i - 1} + b\mod p\),\(p\)是素数,已知\(x_0,a,b,p\),给出一个\(n\)和\(v\),问你满足\(x_i = v ...

  6. 牛客多校第五场 F take

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 题目描述 Kanade has n boxes , the i-th box has p[i] ...

  7. 牛客多校第五场 J:Plan

    链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  8. 牛客多校第五场-D-inv

    链接:https://www.nowcoder.com/acm/contest/143/D来源:牛客网 题目描述 Kanade has an even number n and a permutati ...

  9. 牛客多校第五场 F take 期望转化成单独事件概率(模板) 树状数组

    链接:https://www.nowcoder.com/acm/contest/143/F来源:牛客网 Kanade has n boxes , the i-th box has p[i] proba ...

随机推荐

  1. [Usaco2007 Jan]Telephone Lines架设电话线

    题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...

  2. nokogiri Fail install on Ruby 2.3 for Windows #1456 <From github>

    Q: gem install railson nokogiri install fail with error: 'nokogiri requires Ruby version < 2.3, & ...

  3. 盼望着,盼望着。它终于来了!!!剪辑Windows PC测试版!

    盼望着,盼望着.它终于来了!!!剪辑Windows PC测试版! 喜欢短视频抖音的小伙伴们,是不是都对手机抖音剪映操作不是很满意.期待WINDOWS电脑版剪映的来临.在此之前只有MAC版本,不能满足广 ...

  4. (Sql Server)存储过程(转载)

    SQL Server 存储过程 Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这 ...

  5. 本地代码上传GitHub

    0. 登录 git config --global user.name "GitHub用户名" git config --global user.email "GitHu ...

  6. Django(orm)转

    转载自 https://www.jianshu.com/p/d92ecd3644f7?utm_campaign=hugo&utm_medium=reader_share&utm_con ...

  7. web.xml启动时调用java类方法

    <listener> <listener-class>com.test</listener-class> //该类为java类路径标示要执行的接口 需在web.xm ...

  8. UML——部署图

    一.What 概念: 1.部署图:用来展示所开发系统的硬件配置和组成.软件布局的一个网络拓扑结构图. 2.组成元素:节点.连接.(补充:处理器.设备.节点属性和操作) 2.1节点(Node):是一个物 ...

  9. Pytest(5)美化插件进度条pytest-sugar

    前言 在我们进行自动化测试的时候,用例往往是成百上千,执行的时间是几十分钟或者是小时级别.有时,我们在调试那么多用例的时候,不知道执行到什么程度了,而pytest-sugar插件能很好解决我们的痛点. ...

  10. HBase 数据迁移方案介绍(转载)

    原文链接:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html 一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分 ...