记录编号 169879 评测结果 AAAAAAAAAA
题目名称 线性递推式 最终得分 100
用户昵称 Gravatar落尘 是否通过 通过
代码语言 C++ 运行时间 0.012 s
提交时间 2015-07-11 10:52:55 内存使用 0.32 MiB
显示代码纯文本
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#define LL long long int
#define NUM_MOD 9973
using namespace std;
LL N;
int D;
class MATRIX{
public:
	LL s[21][21];
	int n,m;
//以下,初始化。。。
	void clear(){
		memset(s,0,sizeof(s));
		n=m=0;
	}
	MATRIX(){clear();}
//以下,单位矩阵。。。
	void NEW_MATRIX(int x){
		clear();
		m=n=x;
		for(int i=1;i<=n;++i)
			s[i][i]=1;
	}
//以下,operator* 重载。。。
	MATRIX operator* (MATRIX b){
		MATRIX c;MATRIX a=*this;//a*b
		c.n=a.n,c.m=b.m;
		for(int i=1;i<=c.n;++i)
			for(int j=1;j<=c.m;++j)
				for(int k=1;k<=a.m;++k)
					c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j])%NUM_MOD;
		return c;
	}
//以下,输出。。。
//(最后单独输出也可。。。)
	void Print(){ printf("%d\n",s[1][D]); }
}S,T;
//以下,快速幂。。。
MATRIX QUICK_POW(MATRIX a,LL n){
	MATRIX ans;
	ans.NEW_MATRIX(a.n);
	while(n){
//让我看看是奇还是偶。。。
//1UL就是1啦,但是快那么一点点。。。
		if(n&1UL)
			ans=ans*a;
		a=a*a;
		n>>=1UL;
	}
	return ans;
}
void init(){
    scanf("%d%lld",&D,&N);
//以下,初始化。。。
	S.clear(),T.clear();//初始矩阵和单位矩阵清0。。。
	S.n=1,S.m=D+1;//初始矩阵大小。。。
	T.n=T.m=D+1;//D+1阶矩阵。。。
	for(int i=1;i<=D+1;++i)
		scanf("%lld",&T.s[i][D]),
		T.s[i][D]%=NUM_MOD;//管他有没有用。。。
	for(int i=1;i<=D;++i)
		scanf("%lld",&S.s[1][i]),
		S.s[1][i]%=NUM_MOD;
//以下,设置单位矩阵。。。
	for(int i=1;i<D;++i)
		T.s[i+1][i]=1;
	S.s[1][D+1]=1;T.s[D+1][D+1]=1;//差点忘了写它们。。。
}
int main(){
    freopen("recursion.in","r",stdin);
	freopen("recursion.out","w",stdout);
	init();
	S=S*QUICK_POW(T,N+1-D);
	S.Print();
	fclose(stdin);
	fclose(stdout);
	return 0;
}