参考地址:http://acshiryu.com/archives/1349
如图:
就是求第n个图形的上三角形的个数。
设f[n]为第n个图形的上三角的个数 g[n]为第n个图形的下三角的个数
则有:
f[n]=3*f[n-1]+g[n-1];
g[n]=3*g[n-1]+f[n-1];
可以用矩阵快速幂解决。
#include<iostream>
#include<cstdio>
#define Mod 1000000007
using namespace std;
struct Matrax {
__int64 m[3][3];
};
Matrax per , A;
void Init() {
A.m[0][0] = 3;per.m[0][0] = 1;
A.m[0][1] = 1;per.m[0][1] = 0;
A.m[1][0] = 1;per.m[1][0] = 0;
A.m[1][1] = 3;per.m[1][1] = 1;
}
Matrax multi(Matrax a , Matrax b) {
int i , j , k;
Matrax c;
for(i = 0 ; i < 2 ; i ++)
for(j = 0 ; j < 2 ; j ++) {
c.m[i][j] = 0;
for(k = 0 ; k < 2; k ++) {
c.m[i][j] += a.m[i][k]*b.m[k][j];
c.m[i][j]%=Mod;
}
}
return c;
}
Matrax power(__int64 k) {
Matrax p , ans;
ans = per;
p = A;
while(k) {
if(k&1) {
ans = multi(ans , p);
}
k/=2;
p = multi(p , p);
}
return ans;
}
int main() {
__int64 n;
Init();
while(scanf("%I64d",&n)!=EOF) {
Matrax ans;
ans = power(n);
printf("%d\n",ans.m[0][0]);
}
}