1340. 【递推与矩阵乘法优化】骨牌覆盖问题

1340. 【递推与矩阵乘法优化】骨牌覆盖问题

【题目】

有2行n(n<2^31)列的长方形方格,要求用n个1*2的骨牌铺满。有多少种铺法? 由于答案很大,只需输出答案mod (10^9+7)的值。

输入:

一个整数n

输出

所求方案数

样例输入

8

样例输出

34

【思路】

就是学的矩阵乘法优化咯;
朴素算法 递推关系式:f[i]=f[i-1]+f[i-2];
矩阵:【f[i] f[i-1]】=【f[i-1] f[i-2]】*【1 1 1 0】^1

【代码】

#include<bits/stdc++.h>
using namespace std;
long long mod=1000000007;
struct node{
	long long m[2][2];
}ans,base;
node qsort(node x,node y){
	node c;
	for(int i=0;i<2;i++)
	for(int j=0;j<2;j++){
		c.m[i][j]=0;
		for(int k=0;k<2;k++){
		c.m[i][j]+=(x.m[i][k]*y.m[k][j])%mod;
		c.m[i][j]%=mod;
	}
	}
	return c;
}
long long sp(long long nn){
	base.m[0][0]=base.m[0][1]=base.m[1][0]=1;
	base.m[1][1]=0;
	ans.m[0][0]=ans.m[1][1]=1;
	ans.m[1][0]=ans.m[0][1]=0;
	while(nn){
		if(nn%2==1)ans=qsort(ans,base);
		base=qsort(base,base);
		nn>>=1;
	}
	return ans.m[0][1]%mod;
}
int main(){
	long long n;
	cin>>n;
	cout<<sp(n+1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Double020/article/details/87858550