终于1A了一道题,不容易哈哈
昨天心态不好,天气又热,导致效率极低~
今天加油了!
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long
int d,n,m;
struct matrix {
LL m[60][60]; //最好无脑LL就行
matrix () {
memset(m,0,sizeof(m));
}
}; //结构体后面别忘了加;了!
matrix mul(matrix a,matrix b) {
matrix tmp;
for(int i = 1;i <= d;i++)
for(int k = 1;k <= d;k++)
if(a.m[i][k]) //小优化
for(int j = 1;j <= d;j++)
tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % m;
return tmp;
}
matrix powmul(matrix a,int n) {
matrix tmp;
for(int i = 1;i <= d;i++)
tmp.m[i][i] = 1;
while(n) {
if(n & 1)
tmp = mul(tmp,a);
a = mul(a,a);
n >>= 1;
}
return tmp;
}
int main() {
while(scanf("%d%d%d",&d,&n,&m) != EOF && (d || n || m)) {
matrix base;
for(int i = 1;i <= d;i++)
scanf("%lld",&base.m[1][i]);
for(int i = 1;i < d;i++)
base.m[i+1][i] = 1;
/*for(int i = 1;i <= d;i++) {
for(int j = 1;j <= d;j++)
printf("%lld ",base.m[i][j]);
printf("\n");
}*/
int num[25];
for(int i = 1;i <= d;i++)
scanf("%d",&num[i]);
if(n <= d)
printf("%d\n",num[n]);
else {
base = powmul(base,n-d);
/*for(int i = 1;i <= d;i++) {
for(int j = 1;j <= d;j++)
printf("%lld ",base.m[i][j]);
printf("\n");
}*/
LL ans = 0;
for(int i = 1;i <= d;i++)
ans += (num[d-i+1] * base.m[1][i]) % m;
printf("%lld\n",ans % m);
}
}
return 0;
}