Description

在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。

现在他想计算这样一个函数的值:

$$f(n)=\sum_{i=0}^n\sum_{j=0}^i S(i,j)\times 2^j\times(j!)$$

$S(i,j)$表示第二类斯特林数,递推公式为:
$S(i,j)=j\times S(i-1,j)+S(i-1,j-1),1\leq j\leq i-1$。
边界条件为:$S(i,i)=1(0\leq i),S(i,0)=0(1\leq i)$
你能帮帮他吗?

Input

输入只有一个正整数$n$

Output

输出$f(n)$。

由于结果会很大,输出$f(n)$对$998244353(7×17×223+1)$取模的结果即可。

题解:

递推式给你就是玩你的,一点关系都没有!

第二类斯特林数通项公式:

$$S(i,j)=\frac{1}{j!}\sum_{k=0}^j(-1)^k C_j^k(j-k)^i$$

代入原式得

$$\sum_{i=0}^n\sum_{j=0}^i \frac{1}{j!}\sum_{k=0}^j(-1)^k C_j^k(j-k)^i\times 2^j\times(j!)$$

组合数展开得

$$\sum_{i=0}^n\sum_{j=0}^i 2^j\sum_{k=0}^j(-1)^k\frac{j!}{k!(j-k)!}(j-k)^i$$

交换枚举顺序得

$$\sum_{j=0}^n(j!)2^j\sum_{k=0}^n{(-1)^k\over k!}{1\over (j-k)!}\sum_{i=0}^n(j-k)^i$$

看到又有$k$又有$j-k$,这不是卷积吗?

令 $a(x)=\sum_{x=0}^n{(-1)^x\over x!}$

$b(x)={1\over (x)!}\sum_{i=0}^n(x)^i$

则 $f(x)=(x!)2^x\sum_{i=0}^n a(x)b(x-i)$

不过循环边界到n不会越界吗?这对答案没有影响,因为斯特林数和组合数都为0。

那就直接NTT了,刚好给了一个NTT模数。(这莫非是提示?)

CODE:

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. #define mod 998244353
  6. int n,bit=,rev[],ans=;
  7. long long fac[],inv[],ivf[];
  8. long long a[],b[];
  9.  
  10. int qpow(int x,int y){
  11. int ans=;
  12. while(y){
  13. if(y&)ans=1LL*ans*x%mod;
  14. y>>=,x=1LL*x*x%mod;
  15. }
  16. return ans;
  17. }
  18.  
  19. void init(){
  20. fac[]=ivf[]=inv[]=inv[]=;
  21. for(int i=;i<=n;i++)fac[i]=fac[i-]*i%mod;
  22. for(int i=;i<=n;i++)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
  23. for(int i=;i<=n;i++)ivf[i]=ivf[i-]*inv[i]%mod;
  24. a[]=b[]=;
  25. for(int i=,f=-;i<=n;i++,f=-f){
  26. if (i==)a[i]=n+;
  27. else a[i]=ivf[i]*(qpow(i,n+)-)%mod*inv[i-]%mod;
  28. b[i]=f*ivf[i]%mod;
  29. if(a[i]<)a[i]+=mod;
  30. if(b[i]<)b[i]+=mod;
  31. }
  32. }
  33.  
  34. void get_rev(){
  35. while(bit<=n+n)bit<<=;
  36. for(int i=;i<bit;i++)
  37. rev[i]=(rev[i>>]>>)|(i&)*(bit>>);
  38. }
  39.  
  40. void NTT(long long a[],int dft){
  41. for(int i=;i<bit;i++)
  42. if(i<rev[i])swap(a[i],a[rev[i]]);
  43. for(int i=;i<bit;i<<=){
  44. long long W=qpow(,(mod-)/i/);
  45. if(dft==-)W=qpow(W,mod-);
  46. for(int j=;j<bit;j+=i<<){
  47. long long w=;
  48. for(int k=j;k<i+j;k++,w=w*W%mod){
  49. long long x=a[k];
  50. long long y=w*a[k+i]%mod;
  51. a[k]=(x+y)%mod,a[k+i]=(x+mod-y)%mod;
  52. }
  53. }
  54. }
  55. int inv=qpow(bit,mod-);
  56. if(dft==-)for(int i=;i<bit;i++)a[i]=a[i]*inv%mod;
  57. }
  58.  
  59. int main(){
  60. scanf("%d",&n);
  61. init();
  62. get_rev();
  63. NTT(a,),NTT(b,);
  64. for(int i=;i<bit;i++)(a[i]*=b[i])%=mod;
  65. NTT(a,-);
  66. for(int i=;i<=n;i++){
  67. ans+=qpow(,i)*fac[i]%mod*a[i]%mod;
  68. if(ans>=mod)ans-=mod;
  69. }
  70. printf("%d",ans);
  71. }

【BZOJ4555】【TJOI2016】【HEOI2016】求和 (第二类斯特林数+NTT卷积)的更多相关文章

  1. bzoj 4555 [Tjoi2016&Heoi2016] 求和 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555 关于第二类斯特林数:https://www.cnblogs.com/Wuweizhen ...

  2. BZOJ 4555:[TJOI2016&HEOI2016]求和(第二类斯特林数+NTT)

    题目链接 \(Description\) 求 \[\sum_{i=0}^n\sum_{j=0}^iS(i,j)2^jj!\]对998244353取模后的结果. \(n<=10^5\) \(Sol ...

  3. 【BZOJ4555】【TJOI2016】【HEOI2016】求和 第二类斯特林数 NTT

    题目大意 求\(f(n)=\sum_{i=0}^n\sum_{j=0}^i2^j\times j!\times S(i,j)\\\) 对\(998244353\)取模 \(n\leq 100000\) ...

  4. BZOJ4555 [Tjoi2016&Heoi2016]求和 【第二类斯特林数 + NTT】

    题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + ...

  5. P4091 [HEOI2016/TJOI2016]求和(第二类斯特林数+NTT)

    传送门 首先,因为在\(j>i\)的时候有\(S(i,j)=0\),所以原式可以写成\[Ans=\sum_{i=0}^n\sum_{j=0}^nS(i,j)\times 2^j\times j! ...

  6. BZOJ5093 [Lydsy1711月赛]图的价值 【第二类斯特林数 + NTT】

    题目链接 BZOJ5093 题解 点之间是没有区别的,所以我们可以计算出一个点的所有贡献,然后乘上\(n\) 一个点可能向剩余的\(n - 1\)个点连边,那么就有 \[ans = 2^{{n - 1 ...

  7. bzoj 5093 图的价值 —— 第二类斯特林数+NTT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5093 每个点都是等价的,从点的贡献来看,得到式子: \( ans = n * \sum\li ...

  8. bzoj5093:图的价值(第二类斯特林数+NTT)

    传送门 首先,题目所求为\[n\times 2^{C_{n-1}^2}\sum_{i=0}^{n-1}C_{n-1}^ii^k\] 即对于每个点\(i\),枚举它的度数,然后计算方案.因为有\(n\) ...

  9. BZOJ 5093: [Lydsy1711月赛]图的价值 第二类斯特林数+NTT

    定义有向图的价值为图中每一个点的度数的 \(k\) 次方之和. 求:对于 \(n\) 个点的无向图所有可能情况的图的价值之和. 遇到这种题,八成是每个点单独算贡献,然后累加起来. 我们可以枚举一个点的 ...

随机推荐

  1. javaweb基础(2)_tomcat服务器配置

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  2. MySQL使用INSERT插入多条记录

    MySQL使用INSERT插入多条记录,应该如何操作呢?下面就为您详细介绍MySQL使用INSERT插入多条记录的实现方法,供您参考. 看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语 ...

  3. Bootstrap历练实例:默认的缩略图

    本章将讲解Bootstrap缩略图,大多数站点都需要要在网格中布局图像,视频,文本.Bootstrap通过缩略图为此提供了一些简便的方法,使用Bootstrap创建缩略图的步骤如下: 1.在图像的周围 ...

  4. C#动态数组ArrayList

    在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 一.ArrayList类的常用属性和方法 1. ArrayList类 ...

  5. VueX源码分析(1)

    VueX源码分析(1) 文件架构如下 /module /plugins helpers.js index.esm.js index.js store.js util.js util.js 先从最简单的 ...

  6. linux关于进程、内存和cpu情况

    1.load average: 2.03, 1.76, 1.80 1分钟.5分钟.15分钟平均负载 2.%Cpu(s):100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa ...

  7. 【jenkins】jenkins执行nohup java报错

    nohup:failed to run command 'java':No such file or directory 这是因为jenkins只认绝对路径.在shell里面有涉及到文件的都应该写成绝 ...

  8. jQuery将物体居中,并且转换显示和隐藏

    今天来给大家贴一段代码,代码的作用就是利用jQuery将物体居中,并且转换显示和隐藏: 首先建立一个div标签并且写好css样式,具体如下 然后我想要的效果是当我点击了button这个按钮,test可 ...

  9. 使用 Python 编写登陆接口

    # 使用 Python 编写登陆接口# Create Date: 2017.10.31 Tuesday# Author: Eric Zhao# -*- coding:utf-8 -*-'''编写登陆接 ...

  10. 使用sprunge粘贴文字

    在irc里面请教的时候,需要输出很多文本,irc禁止输入多行文字. 使用sprunge可以返回一个网址,省去复制粘贴的麻烦. 1> 简单使用: command | curl -F "s ...