一个公式题,推不出来
我们令f[i]表示当n=i时的总方案数,令g[i]表示n=i时,结尾恰为1的方案数
那么显然,f[i]=3f[i-1]-g[i]
只需要考虑计算g[i],这个东西是一个叫做默慈金数的东西
递推式为g[n+1]=g[n]+Σg[i]*g[n-i-1]=((2n+3)*g[n]+3n*g[n-1])/(n+3)
直接计算即可
#pragma GCC opitmize("O3")
#pragma G++ opitmize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
#define M 1000000007
#define N 1000010
using namespace std;
LL f[N],g[N],iv[N]; int n,m;
int main(){
scanf("%d",&n); iv[1]=1;
for(int i=2;i<=n+3;++i) iv[i]=iv[M%i]*(M-M/i)%M;
f[1]=g[1]=*g=1; g[2]=2;
for(int i=2;i<=n;++i){
g[i+1]=(g[i]*(2*i+3)%M+3*i*g[i-1]%M)*iv[i+3]%M;
f[i]=((f[i-1]*3)%M-g[i-2]+M)%M;
}
printf("%lld
",f[n]);
}