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;
}