zoukankan      html  css  js  c++  java
  • 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
    ",f[n]);
    }

  • 相关阅读:
    ohmyzsh
    https://github.com/
    init 0,1,2,3,4,5,6
    关于反射
    docker学习笔记
    docker常见问题汇总
    ArrayList的sublist
    java-锁
    CAS-原子操作
    hashMap与concurrentHashMap
  • 原文地址:https://www.cnblogs.com/Extended-Ash/p/9477127.html
Copyright © 2011-2022 走看看