记录编号 86036 评测结果 AAAAAAAAAA
题目名称 [UVa 10870] 递推关系 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.208 s
提交时间 2014-01-19 17:59:40 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<iomanip>
#include<queue>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int SIZEN=20;
ll MOD;
int N,D;
class MATRIX{
public:
	ll s[SIZEN][SIZEN];
	int n,m;//n行m列
	void clear(){
		memset(s,0,sizeof(s));
		n=m=0;
	}
	MATRIX(){clear();}
	void assign_one(int x){//初始化为x*x的单位矩阵
		clear();
		m=n=x;
		for(int i=1;i<=n;i++) s[i][i]=1;
	}
	void print(void){
		cout<<"size:"<<n<<" "<<m<<endl;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++) cout<<s[i][j]<<" ";
			cout<<endl;
		}
	}
};
MATRIX operator * (MATRIX a,MATRIX b){
	MATRIX c;
	c.n=a.n,c.m=b.m;
	int i,j,k;
	for(i=1;i<=c.n;i++){
		for(j=1;j<=c.m;j++){
			for(k=1;k<=a.m;k++){
				c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j])%MOD;
			}
		}
	}
	return c;
}
MATRIX quickpow(MATRIX a,int n){//a^n
	MATRIX ans;
	ans.assign_one(a.n);
	while(n){
		if(n&1) ans=ans*a;
		a=a*a;
		n>>=1;
	}
	return ans;
}
MATRIX ori,step;
bool work(void){
	scanf("%d%d%lld",&D,&N,&MOD);
	if(N==0&&D==0&&MOD==0) return false;
	ori.clear(),step.clear();
	ori.n=1,ori.m=D;
	step.n=step.m=D;
	for(int i=1;i<=D;i++) scanf("%lld",&step.s[D+1-i][D]),step.s[D+1-i][D]%=MOD;
	for(int i=1;i<D;i++) step.s[i+1][i]=1;
	for(int i=1;i<=D;i++) scanf("%lld",&ori.s[1][i]),ori.s[1][i]%=MOD;
	ori=ori*quickpow(step,N-D);
	printf("%lld\n",ori.s[1][D]);
	return true;
}
int main(){
	freopen("recurrences.in","r",stdin);
	freopen("recurrences.out","w",stdout);
	while(work());
	return 0;
}