hdu 5015 233 Matrix 線性序列構造矩陣快速冪


http://blog.csdn.net/kep159/article/details/39272075

第一行左移一位,序列變爲線性,構造矩陣快速冪

#include<stdio.h>  
#include<string.h>  
#include<math.h>  
#include<stdlib.h>  
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const ll mod=1e7+7;

int n,m;
ll p[12];
struct node
{
	ll a[12][12];
}T,I;
node multi(node A,node B)
{
	int i,j,k;
	node C;
	memset(C.a,0,sizeof(C.a));
	for(i=0;i<=n+1;i++)
		for(j=0;j<=n+1;j++)
		{
			for(k=0;k<=n+1;k++)
			{
				C.a[i][j]+=A.a[i][k]*B.a[k][j];
				C.a[i][j]%=mod;
			}
			C.a[i][j]=(C.a[i][j]+mod)%mod;
		}
	return C;
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i,j,k;
		for(i=1;i<=n;i++)
			scanf("%I64d",&p[i]);
		for(i=0;i<=n+1;i++)
			for(j=0;j<=n+1;j++)
				if(i==j) I.a[i][j]=1;
				else I.a[i][j]=0;
		memset(T.a,0,sizeof(T.a));
		T.a[0][0]=10;
		T.a[0][n+1]=1;
		for(i=1;i<=n;i++)
			for(j=0;j<=i;j++)
				T.a[i][j]=1;
		T.a[n+1][n+1]=1;
		while(m)
		{
			if(m&1)
				I=multi(I,T);
			m>>=1;
			T=multi(T,T);
		}
		p[0]=233;
		p[n+1]=3;
		ll sum=0;
		for(i=0;i<=n+1;i++)
		{
			sum+=p[i]*I.a[n][i];
			sum%=mod;
		}
		cout<<sum<<endl;
	}
}


發佈了212 篇原創文章 · 獲贊 3 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章