Log Concave Sequences
题目中说到,对于每个,有
,于是乎,我们可以看成是多个三元组的合并了。
那么,又该如何去计算答案呢?我们不妨看成多个基础三元组的方案了,这样的形式,有
,于是方便与去构造这样的方案,我们可以看成i到j和j到k两条路,于是就是通过路径来求解了。
我们看成路径和
于是,我们哈希第一条路径,因为他们的值是0~2的,所以我们将第一条路径哈希成为
同理,将第二条路径哈希成为
,于是我们就可以用一个9*9的矩阵(0~8)*(0~8)大小,来求解当长度为N时候的方案数了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const ll mod = 1e9 + 7;
struct matrice
{
ll a[9][9];
matrice() { memset(a, 0, sizeof(a)); }
friend matrice operator * (matrice x, matrice y) //重载函数,矩阵的乘积得到的新矩阵
{
matrice ans;
for(int i=0; i<9; i++)
{
for(int j=0; j<9; j++)
{
ll tmp = 0;
for(int k=0; k<9; k++)
{
tmp = (tmp + x.a[i][k] * y.a[k][j] % mod) % mod; //最后得到的需要取mod
}
ans.a[i][j] = tmp;
}
}
return ans;
}
}Bas;
matrice Fast_Mi(matrice x, ll ti)
{
matrice ans;
for(int i=0; i<9; i++) ans.a[i][i] = 1; //构造单位阵
while(ti)
{
if(ti & 1LL) ans = ans * x;
x = x * x;
ti >>= 1LL;
}
return ans;
}
ll N, ans;
int main()
{
for(int i=0; i<=2; i++) for(int j=0; j<=2; j++) for(int k=0; k<=2; k++) if(i * k <= j * j) Bas.a[3 * i + j][3 * j + k] = 1;
scanf("%lld", &N);
Bas = Fast_Mi(Bas, N - 2LL);
for(int i=0; i<9; i++) for(int j=0; j<9; j++) ans = (ans + Bas.a[i][j]) % mod;
printf("%lld\n", ans);
return 0;
}