51Nod1556 计算

题目看这里

一个公式题,推不出来

我们令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\n",f[n]);
}

posted @ 2018-02-22 21:21  扩展的灰(Extended_Ash)  阅读(106)  评论(0编辑  收藏  举报