• Source
    1. #include<bits/stdc++.h>
    2.  
    3. using namespace std;
    4.  
    5. struct matrix
    6. {
    7. long long v[20][20];
    8.  
    9. } mat,ans;
    10.  
    11. long long d,n,mod,F[20];
    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. ios_base::sync_with_stdio(0);
    61.  
    62. cin.tie(0);
    63.  
    64. while(cin>>d>>n>>mod)
    65. {
    66. if(d==0 && n==0 && mod==0)
    67. break;
    68.  
    69. memset(mat.v,0,sizeof(mat.v));
    70.  
    71. for(int i=0; i<d; i++)
    72. {
    73. cin>>mat.v[0][i];
    74. }
    75.  
    76. for(int i=0; i<d; i++)
    77. {
    78. cin>>F[i];
    79. }
    80.  
    81. if(n<=d)
    82. printf("%lld\n",F[n-1]%mod);
    83.  
    84. else
    85. {
    86. for(int i = 1; i < d; ++i)
    87. {
    88. mat.v[i][i-1] = 1;
    89. }
    90.  
    91. long long res = 0;
    92.  
    93. ans = power(n-d);
    94.  
    95. for(int i=0; i<d; i++)
    96. {
    97. res += (F[d-i-1]*ans.v[0][i])%mod;
    98.  
    99. res = res%mod;
    100. }
    101.  
    102. printf("%lld\n", res);
    103. }
    104. }
    105.  
    106. return 0;
    107. }
    108.