您的位置:首页 > 其它

HDU 5015 233 Matrix (矩阵快速幂)

2014-09-15 19:37 465 查看
题目链接:HDU 5015 233 Matrix

题意:已知矩阵的第一行(可以递推出来)和第一列,其他ai,j = ai-1,j +ai,j-1,求an,m



思路:写出先几个ai,j 根据矩阵乘法,得到构造矩阵



其中b1=233;

AC代码:

#include<stdio.h>
#include<string.h>
#define ll __int64
const ll kmod=10000007;
struct Matrix
{
	ll m[15][15];		
};
struct Matrix I,aa;
ll n;

void init()
{
	ll i,j;
	memset(I.m,0,sizeof I.m);
	for(i=0;i<=14;i++)
		I.m[i][i]=1;
	memset(aa.m,0,sizeof aa.m);
	for(i=1;i<=14;i++)
	{
		for(j=i;j<=14;j++)
			aa.m[i][j]=1;
	}
	aa.m[0][0]=1;
	aa.m[0][1]=3;
	aa.m[1][1]=10;
}

Matrix mul(Matrix a,Matrix b)
{
	ll i,j,k;
	Matrix c;
	for(i=0;i<n+2;i++)
	{
		for(j=0;j<n+2;j++)
		{
			c.m[i][j]=0;
			for(k=0;k<n+2;k++)
			{
				c.m[i][j]+=(a.m[i][k]*b.m[k][j])%kmod;
				c.m[i][j]%=kmod;
			}
		}
	}
	return c;
}

Matrix quickpow(Matrix a,ll p)
{
	Matrix b,m;
	b=I,m=a;
	while(p)
	{
		if(p%2) b=mul(b,m);
		p/=2;
		m=mul(m,m);
	}
	return b;
}
int main()
{
	ll m;
	ll i,j,k;
	init();
	Matrix a,c;
	while(scanf("%I64d %I64d",&n,&m)!=EOF)
	{
		a.m[0][0]=1,a.m[0][1]=233;
		for(i=2;i<n+2;i++)
			scanf("%I64d",&a.m[0][i]);
		Matrix ans;
		if(m==0)
		{
			printf("%I64d\n",a.m[0][n+1]%kmod);
			continue;
		}
		ans=quickpow(aa,m);
		for(i=0;i<n+2;i++)
		{
			c.m[0][i]=0;
			for(k=0;k<n+2;k++)
			{
				c.m[0][i]+=(a.m[0][k]*ans.m[k][i])%kmod;
				c.m[0][i]%=kmod;
			}
		}
		printf("%I64d\n",c.m[0][n+1]%kmod);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: