您的位置:首页 > 其它

POJ 3420 矩阵乘法

2012-10-11 19:15 288 查看
题意:

4*N的矩形中放入1*2的小矩形有多少种放法

分析:

表示公式不会推导。。没找着有人推公式的证明了。。。

求证明、、、

f(n)=f(n-1)+5*f(n-2)+f(n-3)-f(n-4)

手动算出来前4项,然后处理线性递推式就好了~

View Code

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

struct MT
{
int x,y;
int mt[7][7];
}ans,def;

int n,m;

inline MT operator *(MT a,MT b)
{
MT c;
memset(c.mt,0,sizeof c.mt);
c.x=a.x; c.y=b.y;
for(int i=1;i<=a.x;i++)
for(int j=1;j<=b.y;j++)
for(int k=1;k<=a.y;k++)
c.mt[i][j]=(c.mt[i][j]+(a.mt[i][k]%m)*(b.mt[k][j]%m))%m;
return c;
}

void go()
{
while(n)
{
if(n&1) ans=def*ans;
def=def*def;
n>>=1;
}
printf("%d\n",ans.mt[4][1]);
}

bool prev()
{
if(n==1) {printf("%d\n",1%m);return false;}
else if(n==2) {printf("%d\n",5%m);return false;}
else if(n==3) {printf("%d\n",11%m);return false;}
n-=4;

memset(def.mt,0,sizeof def.mt);
def.mt[1][2]=def.mt[2][3]=def.mt[3][4]=1;
def.mt[4][1]=-1; def.mt[4][2]=1; def.mt[4][3]=5; def.mt[4][4]=1;
def.x=def.y=4;

ans.x=4; ans.y=1;
ans.mt[1][1]=1; ans.mt[2][1]=5; ans.mt[3][1]=11; ans.mt[4][1]=36;
return true;
}

int main()
{
while(scanf("%d%d",&n,&m),n)
{
if(!prev()) continue;
else go();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: