uva 10870 Recurrences

題意:

給你d,n,m,

a1,a2,a3,......

f(1),f(2),f(3),f(4).......

定義:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + ad f(n − d), for n > d

求 f(n)%m

思路:

不多說水題

#include<bits/stdc++.h>
using namespace std;
struct node
{
	long long a[15][15];
};
long long N;
const node A={
	          {
				{0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
				{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
	          }
             };
node cheng(node a,node b,int m)
{
	node c;
	memset(c.a,0,sizeof(c.a));
	for(int i=0;i<m;i++){
	for(int j=0;j<m;j++)
	for(int k=0;k<m;k++)
	c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%N)%N;
	}
	return c;
}
void p(node a,int m)
{
	for(int i=0;i<m;i++){
	for(int j=0;j<m;j++)
	printf("%lld%c",a.a[i][j]," \n"[j==m-1]);	
	}
	printf("\n");
}
int main()
{
	int d,n,m;
	node a,b;
	while(~scanf("%d%d%d",&d,&n,&m),d+n+m)
    {
    	N=m;
    	memset(a.a,0,sizeof(a.a));
    	memset(b.a,0,sizeof(b.a));
    	a=A;
    	for(int i=0;i<d;i++){
    	scanf("%lld",&(a.a[i][0]));	
    	a.a[i][0]%=N;
    	}
    	for(int i=d-1;i>=0;i--){
    	scanf("%lld",&(b.a[0][i]));	
    	b.a[0][i]%=N;
    	}
		//	p(b,d);
		//	p(a,d);
    	if(n<=d) {
    		printf("%lld\n",(b.a[0][n-d]%N+N)%N);
    		continue;
    	} 
		n-=d;
		while(n)
    	{
    		if(n&1) b=cheng(b,a,d);
    		n>>=1;
    		a=cheng(a,a,d);
    	}
    	printf("%lld\n",(b.a[0][0]%N+N)%N);
    }	
	return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章