记录编号 577949 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2013]矩阵游戏 最终得分 100
用户昵称 Gravatarop_组撒头屯 是否通过 通过
代码语言 C++ 运行时间 1.674 s
提交时间 2022-12-13 15:14:35 内存使用 1.83 MiB
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=1000000007;
  5. struct sdf{
  6. ll p[2][2];
  7. sdf(){
  8. for (int i=0;i<=1;i++){
  9. for (int j=0;j<=1;j++)p[i][j]=0;
  10. }
  11. }
  12. sdf operator*(const sdf&x){
  13. sdf tmp;
  14. for (int i=0;i<=1;i++){
  15. for (int j=0;j<=1;j++){
  16. for (int k=0;k<=1;k++){
  17. tmp.p[i][j]=(tmp.p[i][j]+p[i][k]*x.p[k][j]%mod)%mod;
  18. }
  19. }
  20. }
  21. return tmp;
  22. }
  23. }A[12],B,C,D[12],E,bs,tmp;
  24. ll a,b,c,d;
  25. string n,m;
  26. int nl,ml;
  27. sdf pw(sdf x,int y){
  28. if (!y)return bs;
  29. if (y&1)return pw(x,y-1)*x;
  30. sdf P=pw(x,y/2);return P*P;
  31. }
  32. void fst1(int pt){
  33. if (pt>=nl)return ;
  34. C=pw(C,10);
  35. C=C*A[n[pt]-'0'];
  36. fst1(pt+1);
  37. }
  38. void fst2(int pt){
  39. if (pt>=ml)return ;
  40. E=pw(E,10);
  41. E=E*D[m[pt]-'0'];
  42. fst2(pt+1);
  43. }
  44. int main(){
  45. freopen ("matrixb.in","r",stdin);
  46. freopen ("matrixb.out","w",stdout);
  47. cin>>m>>n;
  48. scanf("%lld%lld%lld%lld",&a,&b,&c,&d);
  49. ml=m.length(),nl=n.length();
  50. for (int i=ml-1;i>=0;i--){
  51. if (m[i]=='0')m[i]='9';
  52. else{
  53. m[i]--;break;
  54. }
  55. }
  56. for (int i=nl-1;i>=0;i--){
  57. if (n[i]=='0')n[i]='9';
  58. else{
  59. n[i]--;break;
  60. }
  61. }
  62. A[1].p[0][0]=a;A[1].p[0][1]=b;A[1].p[1][0]=0;A[1].p[1][1]=1;
  63. B.p[0][0]=c;B.p[0][1]=d;B.p[1][0]=0;B.p[1][1]=1;
  64. bs.p[0][0]=bs.p[1][1]=1;bs.p[0][1]=bs.p[1][0]=0;
  65. A[0]=D[0]=C=E=bs;
  66. for (int i=2;i<=9;i++)A[i]=A[i-1]*A[1];
  67. if (n[0]!='0')fst1(0);
  68. else fst1(1);
  69. D[1]=C*B;
  70. for (int i=2;i<=9;i++)D[i]=D[i-1]*D[1];
  71. if (m[0]!='0')fst2(0);
  72. else fst2(1);
  73. E=E*C;
  74. ll ans=(E.p[0][0]+E.p[0][1])%mod;
  75. printf("%lld\n",ans);
  76. return 0;
  77. }
  78.