HZNU-2793(矩阵快速幂)
构造出矩阵即可
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int mod = 193;
int n;
ll x;
int w[110], a[110];
struct Matrix{
int m[110][110];
void clear(){
memset(m,0,sizeof(m));
for(int i=0;i<=n-1;i++)
m[i][i]=1;
}
void display(){
cout<<"Matrix's begin:"<<endl;
for(int i=0;i<=n-1;i++)
for(int j=0;j<=n-1;j++)
if(j<n-1) cout<<m[i][j]<<" ";
else cout<<m[i][j]<<endl;
cout<<"Matrix's end:"<<endl;
}
friend Matrix operator*(Matrix a,Matrix b){
Matrix ans;
for(int i=0;i<=n-1;i++)
for(int j=0;j<=n-1;j++){
ans.m[i][j]=0;
for(int k=0;k<=n-1;k++){
ans.m[i][j]+=a.m[i][k]*b.m[k][j];
ans.m[i][j] %= mod;
}
}
return ans;
}
friend Matrix operator^(Matrix base,ll k){
Matrix ans;
ans.clear();
while(k){
if(k&1) ans=ans*base;
base=base*base;
k>>=1;
}
return ans;
}
};
void build(Matrix &base){
memset(base.m,0,sizeof(base.m));
for(int j = 0; j < n; ++ j){
base.m[0][j] = a[j+1];
base.m[j+1][j] = 1;
}
}
int ans[110];
int main(){
scanf("%d %lld", &n, &x);
for(int i = 0; i < n; ++ i) scanf("%d", &w[n-i]);
for(int i = 0; i < n; ++ i) scanf("%d", &a[i+1]);
Matrix base;
build(base);
base = base ^ (x-n);
int wx = 0;
for(int i = 0; i < n; ++ i)
wx += (base.m[0][i] * w[n-i]) % mod;
printf("%d\n", wx % mod);
return 0;
}