• Source
    1. #include<bits/stdc++.h>
    2.  
    3. using namespace std;
    4.  
    5. struct matrix
    6. {
    7. long long v[22][22];
    8.  
    9. } mat,ans;
    10.  
    11. long long d,n,mod,C[22],A[22];
    12.  
    13. matrix multiply(matrix a, matrix b)
    14. {
    15. matrix r;
    16.  
    17. for(int i=0; i<=d; i++)
    18. {
    19. for(int j=0; j<=d; j++)
    20. {
    21. long long sum = 0;
    22.  
    23. r.v[i][j] = 0;
    24.  
    25. for(int k=0; k<=d; k++)
    26. {
    27. sum+=a.v[i][k]*b.v[k][j];
    28.  
    29. sum%=mod;
    30. }
    31.  
    32. r.v[i][j] = sum;
    33. }
    34. }
    35.  
    36. return r;
    37. }
    38.  
    39. matrix power(long long p)
    40. {
    41. if(p==1)
    42. {
    43. return mat;
    44. }
    45.  
    46. if(p%2==1)
    47. {
    48. return multiply(mat,power(p-1));
    49. }
    50.  
    51. matrix ret = power(p/2);
    52.  
    53. ret = multiply(ret,ret);
    54.  
    55. return ret;
    56. }
    57.  
    58. int main()
    59. {
    60. int test;
    61.  
    62. scanf("%d",&test);
    63.  
    64. while(test--)
    65. {
    66. scanf("%lld%lld%lld",&d,&mod,&n);
    67.  
    68. memset(mat.v,0,sizeof(mat.v));
    69.  
    70. for(int i=0; i<=d; i++)
    71. {
    72. scanf("%lld",&C[i]);
    73.  
    74. C[i] = C[i]<0 ? mod-((-C[i])%mod) : C[i]%mod;
    75. }
    76.  
    77. for(int i=0; i<d; i++)
    78. {
    79. scanf("%lld",&A[i]);
    80.  
    81. A[i] = A[i]<0 ? mod-((-A[i])%mod) : A[i]%mod;
    82.  
    83. mat.v[0][i] = C[i];
    84. }
    85.  
    86. mat.v[0][d] = 1;
    87.  
    88. for(int i = 1; i <d; ++i)
    89. {
    90. mat.v[i][i-1] = 1;
    91. }
    92.  
    93. mat.v[d][d] = 1;
    94.  
    95. if(n<d)
    96. printf("%lld\n",A[n]%mod);
    97.  
    98. else
    99. {
    100. long long res = 0;
    101.  
    102. ans = power(n-d+1);
    103.  
    104. for(int i=0; i<d; i++)
    105. {
    106. res += (A[d-i-1]*ans.v[0][i])%mod;
    107.  
    108. res = res%mod;
    109. }
    110.  
    111. res+=(C[d]*ans.v[0][d])%mod;
    112.  
    113. res%=mod;
    114.  
    115. printf("%lld\n", res);
    116. }
    117.  
    118. if(test)
    119. puts("");
    120. }
    121.  
    122. return 0;
    123. }