我们看到了及其可怕的数据范围

这个样子都没有办法直接读入的数据范围应该怎么算

我们观察一下递推式\(f[i][j]=a*f[i][j]+b(j!=1)\)

\(f[i][1]=c*f[i-1][m]+d\)

转移非常简单,于是可以考虑一下矩阵乘法

如果我们将这个矩阵破坏成一个链,那么就会有这种形式的递推

连续推\(m\)次第一个柿子,之后再推一次第二个柿子,之后反复

重复上面的过程\(n\)次就好了

于是我们可以将连续转移\(m\)次一式的到的矩阵和第二个式子的转移矩阵乘起来,之后将这个矩阵再转移\(n\)次就是答案了

由于\(n,m\)是在太大了,我们又发现模数是质数,于是我们可以利用费马小定理来降幂

则有

\[A^{mod-1}\%mod=1
\]

所以

\[A^m\equiv A^{m\%(mod-1)}(\%\ mod )
\]

至于为什么要特判\(a=1\)

我怎么知道啊

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #define re register
  5. #define maxn 5
  6. #define LL long long
  7. const LL mod=1000000007;
  8. char N_[1000005],M_[1000005];
  9. LL n,m,a,b,c,d;
  10. inline LL read()
  11. {
  12. char c=getchar();
  13. LL x=0;
  14. while(c<'0'||c>'9') c=getchar();
  15. while(c>='0'&&c<='9')
  16. x=x*10%(mod-1)+c-48,c=getchar();
  17. return x;
  18. }
  19. struct Mat
  20. {
  21. LL a[4][4],ans[4][4];
  22. inline void did_ans()
  23. {
  24. LL mid[4][4];
  25. for(re int i=1;i<=2;i++)
  26. for(re int j=1;j<=2;j++)
  27. mid[i][j]=ans[i][j],ans[i][j]=0;
  28. for(re int i=1;i<=2;i++)
  29. for(re int j=1;j<=2;j++)
  30. for(re int p=1;p<=2;p++)
  31. ans[i][j]=(ans[i][j]+(a[i][p]*mid[p][j])%mod)%mod;
  32. }
  33. inline void did_a()
  34. {
  35. LL mid[4][4];
  36. for(re int i=1;i<=2;i++)
  37. for(re int j=1;j<=2;j++)
  38. mid[i][j]=a[i][j],a[i][j]=0;
  39. for(re int i=1;i<=2;i++)
  40. for(re int j=1;j<=2;j++)
  41. for(re int p=1;p<=2;p++)
  42. a[i][j]=(a[i][j]+(mid[i][p]*mid[p][j])%mod)%mod;
  43. }
  44. }R,L,K;
  45. inline void mul(Mat &A,Mat &B)
  46. {
  47. LL mid[4][4];
  48. for(re int i=1;i<=2;i++)
  49. for(re int j=1;j<=2;j++)
  50. mid[i][j]=A.ans[i][j],A.ans[i][j]=0;
  51. for(re int i=1;i<=2;i++)
  52. for(re int j=1;j<=2;j++)
  53. for(re int p=1;p<=2;p++)
  54. A.ans[i][j]=(A.ans[i][j]+(mid[i][p]*B.ans[p][j])%mod)%mod;
  55. for(re int i=1;i<=2;i++)
  56. for(re int j=1;j<=2;j++)
  57. A.a[i][j]=A.ans[i][j];
  58. }
  59. int main()
  60. {
  61. scanf("%s%s",N_+1,M_+1);
  62. a=read(),b=read(),c=read(),d=read();
  63. int lenn=strlen(N_+1);
  64. if(a==1)
  65. {
  66. for(re int i=1;i<=lenn;i++) n=n*10%mod+N_[i]-48;
  67. n=(n-2+mod)%mod;
  68. }
  69. else
  70. {
  71. for(re int i=1;i<=lenn;i++) n=n*10%(mod-1)+N_[i]-48;
  72. n=(n-2+mod-1)%(mod-1);
  73. }
  74. lenn=strlen(M_+1);
  75. if(c==1)
  76. {
  77. for(re int i=1;i<=lenn;i++) m=m*10%mod+M_[i]-48;
  78. m=(m-2+mod)%mod;
  79. }
  80. else
  81. {
  82. for(re int i=1;i<=lenn;i++) m=m*10%(mod-1)+M_[i]-48;
  83. m=(m-2+mod-1)%(mod-1);
  84. }
  85. R.a[1][1]=R.ans[1][1]=1;
  86. R.a[2][1]=R.ans[2][1]=b;
  87. R.ans[2][2]=R.a[2][2]=a;
  88. R.ans[1][2]=R.a[1][2]=0;
  89. K=R;
  90. while(m)
  91. {
  92. if(m&1) R.did_ans();
  93. m>>=1;
  94. R.did_a();
  95. }
  96. L.a[1][1]=L.ans[1][1]=1;
  97. L.a[2][1]=L.ans[2][1]=d;
  98. L.a[2][2]=L.ans[2][2]=c;
  99. L.ans[1][2]=L.a[1][2]=0;
  100. mul(L,R);
  101. while(n)
  102. {
  103. if(n&1) L.did_ans();
  104. n>>=1;
  105. L.did_a();
  106. }
  107. printf("%lld",((L.ans[2][1]+L.ans[2][2])%mod*R.ans[2][2]%mod+R.ans[2][1])%mod);
  108. return 0;
  109. }

【[NOI2013]矩阵游戏】的更多相关文章

  1. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  2. BZOJ 3240: [Noi2013]矩阵游戏

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1586  Solved: 698[Submit][Status ...

  3. BZOJ 3240([Noi2013]矩阵游戏-费马小定理【矩阵推论】-%*s-快速读入)

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec   Memory Limit: 256 MB Submit: 123   Solved: 73 [ Submit][ St ...

  4. (十进制高速幂+矩阵优化)BZOJ 3240 3240: [Noi2013]矩阵游戏

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3240 3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  M ...

  5. P1397 [NOI2013]矩阵游戏(递推)

    P1397 [NOI2013]矩阵游戏 一波化式子,$f[1][m]=a^{m-1}+b\sum_{i=0}^{m-2}a^i$,用快速幂+逆元求等比数列可以做到$logm$ 设$v=a^{m-1}, ...

  6. 【bzoj3240】 Noi2013—矩阵游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=3240 (题目链接) 题意$${F[1][1]=1}$$$${F[i][j]=a*F[i][j-1]+ ...

  7. BZOJ3240 [Noi2013]矩阵游戏

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  8. 3240: [Noi2013]矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

  9. NOI2013矩阵游戏

    Description 婷婷是个喜欢矩阵的小朋友,有一天她想用电脑生成一个巨大的n行m列的矩阵(你不用担心她如何存储).她生成的这个矩阵满足一个神奇的性质:若用F[i][j]来表示矩阵中第i行第j列的 ...

  10. 洛谷P1397 [NOI2013]矩阵游戏

    矩阵快速幂+费马小定理 矩阵也是可以跑费马小定理的,但是要注意这个: (图是盗来的QAQ) 就是说如果矩阵a[i][i]都是相等的,那么就是mod p 而不是mod p-1了 #include< ...

随机推荐

  1. 转 Monitoring Restore/Recovery Progress

    ora-279 是可以忽略的报错 In general, a restore should take approximately the same time as a backup, if not l ...

  2. Python 垃圾回收机制(转)

    概述 python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的策略. 引用计数 Python语言默认采用的垃圾收集机制是『引用计数法 Reference Counting』,该算法最早 ...

  3. ife task0003学习笔记(二):JavaScript原型

    function aaa(){} aaa.prototype.bbb=function(){} var obj1=new aaa() var obj2=new aaa() obj1和obj2都有一个属 ...

  4. http反向代理之haproxy详解

    1.反向代理定义 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求 ...

  5. 净推荐值(NPS):用户忠诚度测量的基本原理及方法

    文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益. 初识NPS 作为互联网行业的用户体验从业者,我们都或多或少会接触一些衡量用户与产品或服务之间关系的指标,常见的指标如 ...

  6. Apache-Maven 的安装及配置

    一. 下载 没有 Maven 的朋友可以去 Apache 的官网下载一个 Maven, Apache-Maven 官网下载 : https://maven.apache.org/download.cg ...

  7. HttpClient请求工具类

    package com.yangche.utils; import org.apache.http.NameValuePair; import org.apache.http.client.Clien ...

  8. Java线程同步打印ABC

    需求: 三个线程,依次打印ABCABCABC.... 方案一: 使用阻塞队列,线程1从队列1获取内容打印,线程2从队列2获取内容打印,线程3从队列3中获取内容打印.线程1把B放到队列3中,线程2把C放 ...

  9. Hibernate中的一对一注解配置

    Card类 package cn.OneToOne2017109.entity; import javax.persistence.*; /** * Created by YSS on 2017/10 ...

  10. Python爬虫之requests模块(2)

    一.今日内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 二.回顾 xpath的解析流程 bs4的解析流程 常用xpath表达式 常用bs4解析方法 三. ...