Description

求 \(\sum\limits_{i=0}^{n-1}\sum\limits_{j=0}^{i}C(i,j)\times (j+1)^m\operatorname{mod}998244353\)

\(n\leq10^9,m\leq 100000\)

Solution

傻逼推式子题...

首先 \(\sum\limits_{i=0}^nC(i,j)=C(n+1,j+1)\),所以原式可化为

\[\sum_{i=1}^nC(n,i)\times i^m
\]

斯特林展开 \(n^k=\sum\limits_{i=0}^nS(k,i)\times i!\times C(n,i)\)

\[\sum_{i=1}^nC(n,i)\times \sum_{k=0}^mC(i,k)\times k!\times S(m,k)
\]

因为 \(S(i,j)=0(i<j)\),所以将 \(k\) 的枚举提前

\[\sum_{k=0}^mS(m,k)\times k!\times \sum_{i=1}^nC(n,i)\times C(i,k)
\]

观察 \(\sum\limits_{i=1}^nC(n,i)\times C(i,k)\) 的组合意义,即先从 \(n\) 个球中选 \(i\) 个,再从 \(i\) 个球中选 \(k\) 个。这和从 \(n\) 个球中先取 \(k\) 个,剩下的球随意拿是等价的。所以 \(\sum\limits_{i=1}^nC(n,i)\times C(i,k)=C(n,k)\times 2^{n-k}\)

\[\sum_{k=0}^mS(m,k)\times k!\times C(n,k)\times 2^{n-k}
\]

将组合数拆开

\[\sum_{k=0}^mS(m,k)\times \frac{n!\times 2^{n-k}}{(n-k)!}
\]

这是个卷积的形式,那么就先 \(NTT\) 一遍求出第二类斯特林数,再 \(NTT\) 求答案就行了。

因为 \(n\) 很大但是 \(k\) 很小,所以 \(\frac{n!}{(n-k)!}\) 是可以算的,数组下标再平移一下就好了。

Code

  1. #include<bits/stdc++.h>
  2. using std::min;
  3. using std::max;
  4. using std::swap;
  5. using std::vector;
  6. typedef double db;
  7. typedef long long ll;
  8. #define pb(A) push_back(A)
  9. #define pii std::pair<int,int>
  10. #define all(A) A.begin(),A.end()
  11. #define mp(A,B) std::make_pair(A,B)
  12. #define inv(x) ksm(x,mod-2)
  13. const int N=4e5+5;
  14. const int mod=998244353;
  15. int fac[N],ifac[N];
  16. int rev[N],a[N],b[N];
  17. int n,m,lim,c[N],d[N];
  18. int ksm(int a,int b,int ans=1){
  19. while(b){
  20. if(b&1) ans=1ll*ans*a%mod;
  21. a=1ll*a*a%mod;b>>=1;
  22. } return ans;
  23. }
  24. int getint(){
  25. int X=0,w=0;char ch=getchar();
  26. while(!isdigit(ch))w|=ch=='-',ch=getchar();
  27. while( isdigit(ch))X=X*10+ch-48,ch=getchar();
  28. if(w) return -X;return X;
  29. }
  30. void ntt(int *f,int opt){
  31. for(int i=0;i<lim;i++) if(i<rev[i]) swap(f[i],f[rev[i]]);
  32. for(int mid=1;mid<lim;mid<<=1){
  33. int tmp=ksm(3,(mod-1)/(mid<<1));
  34. if(opt<0) tmp=inv(tmp);
  35. for(int R=mid<<1,j=0;j<lim;j+=R){
  36. int w=1;
  37. for(int k=0;k<mid;k++,w=1ll*w*tmp%mod){
  38. int x=f[j+k],y=1ll*w*f[j+k+mid]%mod;
  39. f[j+k]=(x+y)%mod,f[j+k+mid]=(mod+x-y)%mod;
  40. }
  41. }
  42. } if(opt<0){
  43. for(int in=inv(lim),i=0;i<lim;i++)
  44. f[i]=1ll*f[i]*in%mod;
  45. }
  46. }
  47. void mul(int *a,int *b){
  48. ntt(a,1),ntt(b,1);
  49. for(int i=0;i<lim;i++) a[i]=1ll*a[i]*b[i]%mod;
  50. ntt(a,-1);
  51. }
  52. signed main(){
  53. n=getint(),m=getint();
  54. fac[0]=ifac[0]=1;
  55. for(int i=1;i<=m;i++) fac[i]=1ll*fac[i-1]*i%mod;
  56. ifac[m]=inv(fac[m]);
  57. for(int i=m-1;i;i--) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
  58. if(n<m){
  59. int ans=0;
  60. for(int i=1;i<=n;i++)
  61. ans=(ans+1ll*fac[n]%mod*ifac[i]%mod*ifac[n-i]%mod*ksm(i,m)%mod)%mod;
  62. printf("%d\n",ans);return 0;
  63. }
  64. lim=1;while(lim<=m+m) lim<<=1;
  65. for(int i=1;i<lim;i++) rev[i]=(rev[i>>1]>>1)|(i&1?lim>>1:0);
  66. for(int i=0;i<=m;i++){
  67. a[i]=1ll*(i&1?mod-1:1)*ifac[i]%mod;
  68. b[i]=1ll*ksm(i,m)*ifac[i]%mod;
  69. } mul(a,b);int now=1;
  70. for(int i=n;i>=n-m;i--){
  71. c[i-n+m]=1ll*ksm(2,i)*now%mod;
  72. now=1ll*now*i%mod;
  73. } mul(a,c);
  74. printf("%d\n",a[m]);
  75. return 0;
  76. }

[EZOJ1007] 神奇的三角形的更多相关文章

  1. 用CSS创建小三角形问题(笔试题常考)

    笔试题中经常遇到用CSS实现某个Div边框添加三角形问题,掌握一点,合理利用div的边框,当div有宽有高时,边框就是不起眼的边框,当div的宽高为0时,边框就是一个小方块,把剩下的三个边透明就是神奇 ...

  2. 图形管线之旅 Part5

    原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑   转载请注明出处   在上一篇关于纹理采样器之后,我们现在回到了3D前端.那 ...

  3. 勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)

    勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创) 大部分的勾股数的题目很多人都是用for来便利,然后判断是不是平方数什么什么的,这样做的时候要对变量类型和很多细节都是要掌握好的 ...

  4. bzoj1006 [HNOI2008]神奇的国度

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 2304  Solved: 1043 Description ...

  5. BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)

    题目大意 K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的.为了巩固三角关系,K 国禁止四边关系,五边关系等 ...

  6. 【BZOJ1006】【HNOI2008】神奇的国度(弦图染色)

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1467  Solved: 603[Submit][Stat ...

  7. 【bzoj1006】[HNOI2008]神奇的国度

    1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3114  Solved: 1401[Submit][Sta ...

  8. 经典CSS实现三角形图标原理解析

    前言: 在写这篇文章之前,我也看过很多前端大神写的代码,But,都只是粘贴代码和给出显示效果,对于初学者来说大家都喜欢刨根问底,为什么要这样做呢? 接下来就让我给大家分享一下我对CSS实现三角形的理解 ...

  9. 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题

    1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...

随机推荐

  1. vue中的import、export、requre的区别

    在es6之前js一直没有自己的模块语法,为了解决这种尴尬就有了require.js的出现.在es6发布之后js又引入了import的概念使得不清楚两者之间的区别的同学在实际使用过程中造成了自己的误解, ...

  2. 深入理解JVM(一)编译openJDK

    此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...

  3. java多线程系列8 高级同步工具(2)CountDownLatch

    CountDownLatch,计数器的初始值为线程的数量.每当一个线程完成了自己的任务后, 计数器的值就会减1.当计数器值到达0时,它表示所有的线程已经完成了任务, 然后在闭锁上等待的线程就可以恢复执 ...

  4. 基于Zxing的二维码的二维码扫描之横屏扫描

    最近项目条码扫描要改为横屏,网上所搜了一下,然后发现我写的需要改动几行代码就可以了,还是很给力的. 如未查看之前的代码,请移步: 基于Zxing的二维码生成和二维码扫描 修改下面写代码就可以实现横屏条 ...

  5. MySQL缓存参数优化(转)

    MySQL 数据库性能优化之缓存参数优化 数据库属于 IO 密集型的应用程序,其主要职责就是数据的管理及存储工作.而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在 ...

  6. JS跨域调用之document.domain--相同基础域名页面之间的调用

    利用document.domain 实现跨域: 前提条件:这两个域名必须属于同一个基础域名!而且所用的协议,端口都要一致,否则无法利用document.domain进行跨域 Javascript出于对 ...

  7. Python 绝技 —— UDP 服务器与客户端

    i春秋作家:wasrehpic 0x00 前言 在上一篇文章「Python 绝技 —— TCP 服务器与客户端」中,介绍了传输层的核心协议 TCP ,并运用 Python 脚本的 socket 模块演 ...

  8. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 8.仪表盘 Dashboard(horizon)安装配置

    仪表盘Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器. 节点配置信息说明 ...

  9. Linux - 结合正则表达式使用grep命令

    Grep with Regular Expression grep命令基本用法 grep [-acinv] [--color=auto] [-A n] [-B n] '搜寻字符串' 文件名参数说明: ...

  10. Testing - 软件测试知识梳理 - 测试模型

    珠玉在前,不再赘言. 软件测试模型 软件测试模型汇总