#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll k,mod;
int n=10;
typedef struct jz{
ll m[11][11];
}jz;
jz mul(jz a,jz b){
jz c;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
c.m[i][j]=0;
for(int k=1;k<=n;k++)
c.m[i][j]=(c.m[i][j]+a.m[i][k]*b.m[k][j]%mod)%mod;
}
return c;
}
jz ksm(jz a,ll b){
jz ans;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==j) ans.m[i][j]=1;
else ans.m[i][j]=0;
}
while(b){
if(b%2) ans=mul(ans,a);
a=mul(a,a);
b/=2;
}
return ans;
}
int main(){
jz A,B;
while(~scanf("%lld%lld",&k,&mod)){
for(int i=1;i<=10;i++) scanf("%lld",&A.m[1][i]);
if(k<10){
cout<<k%mod;
continue;
}
for(int i=2;i<=10;i++)
for(int j=1;j<=10;j++)
A.m[i][j]=1*(i==j+1);
B=ksm(A,k-9);//最右边有q个数 就-(q-1)
ll res=0;//因为mul函数矩阵*矩阵得出的是矩阵。所以要手动乘才能得数
for(int i=1;i<=10;i++)
res=(res+B.m[1][i]*(10-i)%mod)%mod;
//因为只求f(k)就好了,所以只求第一行,剩下 行可不求
printf("%lld\n",res);
}
return 0;
}
07-12
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交