poj 2118
矩阵乘法。
(a[n],a[n+1],a[n+2])=(a[0],a[1],a[2])*A^n.
代码:
#include<iostream>
#include<fstream>
using namespace std;
int a[110];
int map[110][110],map1[110][110],map2[110][110];
int n;
long long m;
void solve(long long m){
int i,j,k;
if(m==1)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map1[i][j]=map[i][j];
else
{
solve(m/2);
if(m/2*2==m)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=0,map2[i][j]=0;k<=n;k++)
{
map2[i][j]+=map1[i][k]*map1[k][j];
map2[i][j]%=10000;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
map1[i][j]=map2[i][j];
}
else
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=0,map2[i][j]=0;k<=n;k++)
{
map2[i][j]+=map1[i][k]*map1[k][j];
map2[i][j]%=10000;
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=0,map1[i][j]=0;k<=n;k++)
{
map1[i][j]+=map2[i][k]*map[k][j];
map1[i][j]%=10000;
}
}
}
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
while(1)
{
cin>>n;
if(n==0)
return;
for(i=1;i<=n;i++)
cin>>a[i];
memset(map,0,sizeof(map));
for(i=n;i>=1;i--)
cin>>map[i][n];
for(i=1;i<n;i++)
map[i+1][i]=1;
cin>>m;
if(m==0) {
cout<<a[1]<<endl;
continue;
}
solve(m);
long long ans=0;
for(i=1;i<=n;i++)
{
ans+=a[i]*map1[i][1];
ans%=10000;
}
cout<<ans<<endl;
}
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号