zoukankan      html  css  js  c++  java
  • bzoj4555-求和

    题目

    (S(i,j))表示第二类斯特林数,求:

    [f(n)=sum _{i=0}^nsum _{j=0}^iS(i,j)*2^j*j! ]

    分析

    公式推理很简单,关键是用到了第二类斯特林数的通项公式和组合数展开的方法。

    [egin{aligned} f(n)&=sum _{i=0}^nsum _{j=0}^iS(i,j)*2^j*j! \ &=sum _{i=0}^nsum _{j=0}^n frac{1}{j!}sum _{k=0}^j (-1)^kC_j^k(j-k)^i*2^j*j! \ &=sum _{j=0}^n frac{1}{j!}*2^j*j!sum _{j=0}^nsum _{k=0}^j (-1)^k frac{j!}{k!(j-k)!} (j-k)^i \ &=sum _{j=0}^n 2^j*j!sum _{k=0}^jfrac{(-1)^k}{k!}sum _{i=0}^nfrac{(j-k)^i}{(j-k)!} \ &=sum _{j=0}^n 2^j*j!sum _{k=0}^jfrac{(-1)^k}{k!}frac{(j-k)^{n+1}-1}{(j-k)!(j-k-1)} \ end{aligned} ]

    令:

    [egin{aligned} B(x)=frac{(-1)^x}{x!} \ C(x)=frac{x^{n+1}-1}{x!(x-1)} end{aligned} ]

    则有:

    [egin{aligned} f(n)=sum _{j=0}^n 2^j*j!sum _{k=0}^jB(k)C(k-j) end{aligned} ]

    一个卷积的形式,直接用NTT求解即可。这里要注意的是,(C(0)=1),因为我们在这里定义(0^0=1)

    代码

    NTT写起来很简单,但有几个地方容易错。一定要注意把(n)化成整二进制的时候,(M)要大于(2n),尽管(n)可能本身是(2)的整数次幂。例如(n=1),这时(M)不能仅仅取到(2),而要取到(4)

    #include<cstdio>
    #include<algorithm>
    #include<cctype>
    using namespace std;
    typedef long long giant;
    const giant q=998244353;
    const giant g=3;
    const giant ig=332748118;
    giant read() {
    	giant x=0,f=1;
    	char c=getchar();
    	for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
    	for (;isdigit(c);c=getchar()) x=x*10+c-'0';
    	return x*f;
    }
    const giant maxn=(1<<18)+1;
    const giant maxj=19;
    giant a[maxn],b[maxn],c[maxn],M,xj,f[maxn],wn[maxj][2];
    giant mi(giant x,giant y) {
    	giant ret=1;
    	while (y) {
    		if (y&1) (ret*=x)%=q;
    		y>>=1,(x*=x)%=q;
    	}
    	return ret;
    }
  • 相关阅读:
    spring boot 启动原理
    log4j相关配置
    JAVA多线程之volatile 与 synchronized 的比较
    Mybatis 一对一、一对多、多对多
    缓存
    spring boot 总结
    学习网站
    Kafka(一)
    hbase(二)
    Zookeeper那些事
  • 原文地址:https://www.cnblogs.com/owenyu/p/6724658.html
Copyright © 2011-2022 走看看