zoukankan      html  css  js  c++  java
  • [HEOI2016/TJOI2016]求和(第二类斯特林数)

    题目

    [HEOI2016/TJOI2016]求和

    关于斯特林数与反演的更多姿势(Longrightarrow)点这里

    做法

    [egin{aligned}\ Ans&=sumlimits_{i=0}^n sumlimits_{j=0}^i egin{Bmatrix}i\jend{Bmatrix}2^j×j!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1\ &=sumlimits_{i=0}^n sumlimits_{j=0}^n egin{Bmatrix}i\jend{Bmatrix}2^j×j!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~2\ &=sumlimits_{j=0}^n 2^j×j!sumlimits_{i=0}^n egin{Bmatrix}i\jend{Bmatrix}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~3\ &=sumlimits_{j=0}^n 2^j×j!sumlimits_{i=0}^n sumlimits_{k=0}^jfrac{(-1)^k}{k!}cdotfrac{(j-k)^i}{(j-k)!}~~~~~~~~~~~~~~~~~~~~4\ &=sumlimits_{j=0}^n 2^j×j!sumlimits_{k=0}^jfrac{(-1)^k}{k!}cdotfrac{ sumlimits_{i=0}^n (j-k)^i}{(j-k)!}~~~~~~~~~~~~~~~~~~~~~~5\ &=sumlimits_{j=0}^n 2^j×j!sumlimits_{k=0}^jfrac{(-1)^k}{k!}cdot frac{(j-k)^{n+1}-1}{(j-k-1)(j-k)!}~~~~~~~6\ end{aligned}]

    总结

    这题非常有意思,最后一步对于蒟蒻来说还是少见的,推到(4)谁都会,然后就无从下手了
    以至于会从头考虑(2^j×j!)的性质,特别容易想偏

    Code

    #include<bits/stdc++.h>
    typedef int LL;
    typedef long long L;
    const LL maxn=3e5+9,mod=998244353,g=3,_g=332748118;
    inline LL Pow(LL base,LL b){
        LL ret(1);
        while(b){
            if(b&1) ret=(L)ret*base%mod; base=(L)base*base%mod; b>>=1;
        }return ret;
    }
    LL fac[maxn],fav[maxn],r[maxn],F[maxn],G[maxn],W[maxn];
    inline void NTT(LL *a,LL n,LL type){
        for(LL i=0;i<n;++i) if(i<r[i]) std::swap(a[i],a[r[i]]);
        for(LL mid=1;mid<n;mid<<=1){
            LL wn(Pow(type?g:_g,(mod-1)/(mid<<1)));
            W[0]=1; for(LL i=1;i<mid;++i) W[i]=(L)W[i-1]*wn%mod;
            for(LL R=mid<<1,j=0;j<n;j+=R)
                for(LL k=0;k<mid;++k){
                	LL x(a[j+k]),y((L)W[k]*a[j+mid+k]%mod);
                	a[j+k]=x+y; if(a[j+k]>=mod) a[j+k]%=mod;
    				a[j+mid+k]=x-y; if(a[j+mid+k]<0) a[j+mid+k]+=mod;
                }
        }
    }
    inline LL Fir(LL n){
        LL limit(1),len(0);
        while(limit<n){
            limit<<=1; ++len;
        }
        for(LL i=0;i<limit;++i) r[i]=(r[i>>1]>>1)|((i&1)<<len-1);
        return limit;
    }
    inline LL Solve_fg(LL n){
        for(LL i=0;i<=n;++i) F[i]=(L)(i&1?mod-1:1)*fav[i]%mod;
        for(LL i=0;i<=n;++i) G[i]=(L)(Pow(i,n+1)+mod-1)%mod*Pow(i-1<0?i+mod-1:i-1,mod-2)%mod*fav[i]%mod;
        G[1]=n+1;
        LL limit(Fir(n+1<<1));
        NTT(F,limit,1); NTT(G,limit,1);
        for(LL i=0;i<limit;++i) F[i]=(L)F[i]*G[i]%mod;
        NTT(F,limit,0);
        LL ty(Pow(limit,mod-2)); for(LL i=0;i<=n;++i) F[i]=(L)F[i]*ty%mod;
        
        LL ret(0);
        for(LL i=0;i<=n;++i) ret=(L)(ret+(L)Pow(2,i)*fac[i]%mod*F[i]%mod)%mod;
        return ret;
    }
    LL n;
    int main(){
        scanf("%d",&n);
        fac[0]=fac[1]=1;
        for(LL i=2;i<=n;++i) fac[i]=(L)fac[i-1]*i%mod;
        fav[n]=Pow(fac[n],mod-2);
        for(LL i=n;i>=1;--i) fav[i-1]=(L)fav[i]*i%mod;
        
        printf("%d",Solve_fg(n));
        return 0;
    }
    
  • 相关阅读:
    软件工程——小学生的四则运算(java)
    软件工程——小学生的四则运算
    利用python实现微信小项目
    SQLite3数据库
    爬虫———python
    模拟足球训练
    文件的转换
    学习成绩雷达图
    <dvi>
    vue 锚点跳转防止路径变化后,刷新页面报错的问题
  • 原文地址:https://www.cnblogs.com/y2823774827y/p/10709820.html
Copyright © 2011-2022 走看看