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;
}

posted on 2011-03-08 16:56  宇宙吾心  阅读(215)  评论(0)    收藏  举报

导航