刚开始看错题了,以为是外构造的,后来才发现是内构造的。
一个正向三角形在下一步会产生3个正向和1个反向的三角形。
一个反向三角形在下一步会产生3个反向和1个正向的三角形。
递推方程:x1 = 3 * x1 + x2; (正向三角形个数)
x2 = 3 * x2 + x1; (反向三角形个数)
构造矩阵:ma = {3 , 1, 1, 3};
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
long long ma[2][2];
long long ans[2][2];
long long mod = 1e9 + 7;
int main()
{
ma[0][0] = 3;
ma[0][1] = 1;
ma[1][0] = 1;
ma[1][1] = 3;
for(int i = 0; i < 2; i++)
ans[i][i] = 1;
long long n;
cin >> n;
long long tmp[2][2];
while(n)
{
if(n & 1)
{
memset(tmp, 0, sizeof(tmp));
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 2; k++)
tmp[i][j] = (tmp[i][j] + ma[i][k] * ans[k][j]) % mod;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
ans[i][j] = tmp[i][j];
}
memset(tmp, 0, sizeof(tmp));
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++)
for(int k = 0; k < 2; k++)
tmp[i][j] = (tmp[i][j] + ma[i][k] * ma[k][j]) % mod;
for(int i = 0; i < 2; i++)
for(int j = 0; j < 2; j++) ma[i][j] = tmp[i][j];
n /= 2;
}
cout << ans[1][1] << endl;
return 0;
}