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

#include<bits/stdc++.h>
using std::min;
using std::max;
using std::swap;
using std::vector;
typedef double db;
typedef long long ll;
#define pb(A) push_back(A)
#define pii std::pair<int,int>
#define all(A) A.begin(),A.end()
#define mp(A,B) std::make_pair(A,B)
#define inv(x) ksm(x,mod-2)
const int N=4e5+5;
const int mod=998244353; int fac[N],ifac[N];
int rev[N],a[N],b[N];
int n,m,lim,c[N],d[N]; int ksm(int a,int b,int ans=1){
while(b){
if(b&1) ans=1ll*ans*a%mod;
a=1ll*a*a%mod;b>>=1;
} return ans;
} int getint(){
int X=0,w=0;char ch=getchar();
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while( isdigit(ch))X=X*10+ch-48,ch=getchar();
if(w) return -X;return X;
} void ntt(int *f,int opt){
for(int i=0;i<lim;i++) if(i<rev[i]) swap(f[i],f[rev[i]]);
for(int mid=1;mid<lim;mid<<=1){
int tmp=ksm(3,(mod-1)/(mid<<1));
if(opt<0) tmp=inv(tmp);
for(int R=mid<<1,j=0;j<lim;j+=R){
int w=1;
for(int k=0;k<mid;k++,w=1ll*w*tmp%mod){
int x=f[j+k],y=1ll*w*f[j+k+mid]%mod;
f[j+k]=(x+y)%mod,f[j+k+mid]=(mod+x-y)%mod;
}
}
} if(opt<0){
for(int in=inv(lim),i=0;i<lim;i++)
f[i]=1ll*f[i]*in%mod;
}
} void mul(int *a,int *b){
ntt(a,1),ntt(b,1);
for(int i=0;i<lim;i++) a[i]=1ll*a[i]*b[i]%mod;
ntt(a,-1);
} signed main(){
n=getint(),m=getint();
fac[0]=ifac[0]=1;
for(int i=1;i<=m;i++) fac[i]=1ll*fac[i-1]*i%mod;
ifac[m]=inv(fac[m]);
for(int i=m-1;i;i--) ifac[i]=1ll*ifac[i+1]*(i+1)%mod;
if(n<m){
int ans=0;
for(int i=1;i<=n;i++)
ans=(ans+1ll*fac[n]%mod*ifac[i]%mod*ifac[n-i]%mod*ksm(i,m)%mod)%mod;
printf("%d\n",ans);return 0;
}
lim=1;while(lim<=m+m) lim<<=1;
for(int i=1;i<lim;i++) rev[i]=(rev[i>>1]>>1)|(i&1?lim>>1:0);
for(int i=0;i<=m;i++){
a[i]=1ll*(i&1?mod-1:1)*ifac[i]%mod;
b[i]=1ll*ksm(i,m)*ifac[i]%mod;
} mul(a,b);int now=1;
for(int i=n;i>=n-m;i--){
c[i-n+m]=1ll*ksm(2,i)*now%mod;
now=1ll*now*i%mod;
} mul(a,c);
printf("%d\n",a[m]);
return 0;
}

[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. Eclipse中代码自动提示功能设置

    Eclipse中代码自动提示功能设置 1 打开eclipse→Windows→Preferences→Java→Editor→Content Assist: 修改Auto Activation tri ...

  2. C++获取工程路径、exe路径

    编码过程中有时候会用到获取工程所在路径或者exe所在的路径信息,这里稍微记录下. 获取工程路径 char pBuf[MAX_PATH]; //存放路径的变量 GetCurrentDirectory(M ...

  3. spring深入学习(五)-----spring dao、事务管理

    访问数据库基本是所有java web项目必备的,不论是oracle.mysql,或者是nosql,肯定需要和数据库打交道.一开始学java的时候,肯定是以jdbc为基础,如下: private sta ...

  4. 9. Bookshops in London 伦敦书店

    9. Bookshops in London 伦敦书店 (1) Londoner are greater readers.They buy vast numbers of newspapers and ...

  5. 利用ONENET平台控制MPC

    可以用于广告机或者灾害预警,实时广播等行业 这个分控制端和服务端 控制端采用winform编写,服务端采用控制台程序编写 优点在于服务端不用有公网ip,比传统方案方便的多. 也不用租用费用高额的云服务 ...

  6. noip第14课资料

  7. 用嵌入式块RAM IP核配置一个双口RAM

    本次设计源码地址:http://download.csdn.net/detail/noticeable/9914173 实验现象:通过串口将数据发送到FPGA 中,通过quartus II 提供的in ...

  8. hiho 第七周 完全背包

    完全背包 #include<iostream> #include<memory.h> #include<cmath> using namespace std; #d ...

  9. 04SQL 查询当天,本月,本周的记录

    SQL 查询当天,本月,本周的记录   SELECT * FROM 表 WHERE CONVERT(Nvarchar, dateandtime, 111) = CONVERT(Nvarchar, GE ...

  10. jsapi微信支付

    JSAPI微信支付 引用js <script type="text/javascript" src="http://res.wx.qq.com/open/js/jw ...