七种方法图解:
/*
题解:先得到递推关系式
f(n)=f(n-1)+f(n-2)*6
用f(n)表示3*n的地板的方案数,
它可以这样铺:第i列只用1*1的块,那么只有一种方案,
也可以i和i-1列一起用2*2与1*1的块铺,或者用2*2的三角和1*1的块铺,这样有6种可能。
然后得到f(n)+2f(n-1)=3(f(n-1)+2f(n-2))
得到f(n)+2f(n-1)关于3^n的表达式
然后令 f(n) + A*3^n = k(f(n-1)+A*3^n-1) 求出A、k。得到递推关系。
*/
#include <stdio.h>
#include <iostream>
using namespace std;
#define P (1000000000+7)
//注意此处如果采用传统的幂函数计算方法,将超时,
//因此采用快速幂算法进行排序https://blog.csdn.net/qq_19782019/article/details/85621386
long long fastPower(long long base, long long power) {
long long result = 1;
while (power > 0) {
if (power & 1) {//此处等价于if(power%2==1)
result = result * base % P;
}
power >>= 1;//此处等价于power=power/2
base = (base * base) % P;
}
return result;
}
int main(){
long long ans,t1=3,t2=-2;
long long n;
scanf("%lld",&n);
ans = (fastPower(3,n+1)+(P-fastPower(-2,n+1)))%P;
if(n!=0) printf("%lld",ans);
else{printf("0");}
return 0;
}
法二:用矩阵快速幂算法。