[EZOJ1007] 神奇的三角形
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)\),所以原式可化为
\]
斯特林展开 \(n^k=\sum\limits_{i=0}^nS(k,i)\times i!\times C(n,i)\)
\]
因为 \(S(i,j)=0(i<j)\),所以将 \(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}\)
\]
将组合数拆开
\]
这是个卷积的形式,那么就先 \(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] 神奇的三角形的更多相关文章
- 用CSS创建小三角形问题(笔试题常考)
笔试题中经常遇到用CSS实现某个Div边框添加三角形问题,掌握一点,合理利用div的边框,当div有宽有高时,边框就是不起眼的边框,当div的宽高为0时,边框就是一个小方块,把剩下的三个边透明就是神奇 ...
- 图形管线之旅 Part5
原文:<A trip through the Graphics Pipeline 2011> 翻译:往昔之剑 转载请注明出处 在上一篇关于纹理采样器之后,我们现在回到了3D前端.那 ...
- 勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创)
勾股数专题-SCAU-1079 三角形-18203 神奇的勾股数(原创) 大部分的勾股数的题目很多人都是用for来便利,然后判断是不是平方数什么什么的,这样做的时候要对变量类型和很多细节都是要掌握好的 ...
- bzoj1006 [HNOI2008]神奇的国度
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 2304 Solved: 1043 Description ...
- BZOJ 1006 [HNOI2008] 神奇的国度(简单弦图的染色)
题目大意 K 国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即 AB 相互认识,BC 相互认识,CA 相互认识,是简洁高效的.为了巩固三角关系,K 国禁止四边关系,五边关系等 ...
- 【BZOJ1006】【HNOI2008】神奇的国度(弦图染色)
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1467 Solved: 603[Submit][Stat ...
- 【bzoj1006】[HNOI2008]神奇的国度
1006: [HNOI2008]神奇的国度 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3114 Solved: 1401[Submit][Sta ...
- 经典CSS实现三角形图标原理解析
前言: 在写这篇文章之前,我也看过很多前端大神写的代码,But,都只是粘贴代码和给出显示效果,对于初学者来说大家都喜欢刨根问底,为什么要这样做呢? 接下来就让我给大家分享一下我对CSS实现三角形的理解 ...
- 【BZOJ】1006: [HNOI2008]神奇的国度 弦图消除完美序列问题
1006: [HNOI2008]神奇的国度 Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则. 他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的 ...
随机推荐
- php.ini 配置详解
这个文件必须命名为''php.ini''并放置在httpd.conf中的PHPIniDir指令指定的目录中.最新版本的php.ini可以在下面两个位置查看:http://cvs.php.net/vie ...
- 网站日志流量分析采集(LuaJIT系统环境部署-node03,相关jar包自己手动上传)
注:/usr/local/src 是源码包路径,可以自己更改 服务器中安装依赖 yum -y install gcc perl pcre-devel openssl openssl-devel 上传 ...
- 前端之js中的函数
函数 函数就是重复执行的代码片. 函数定义与执行 <script type="text/javascript"> // 函数定义 function ...
- WITH RECOMPILE和OPTION(RECOMPILE)区别
在考虑重编译T-SQL(或者存储过程)的时候,有两种方式可以实现强制重编译(前提是忽略导致重编译的其他因素的情况下,比如重建索引,更新统计信息等等), 一是基于WITH RECOMPILE的存储过程级 ...
- code2
#include <unistd.h> #include <sys/syscall.h> #include <linux/kernel.h> #include &l ...
- Nginx的安装与部署
1:安装工具包 wget.vim和gcc yum install -y wget yum install -y vim-enhanced yum install -y make cmake gcc g ...
- Linux下Clamav 杀毒软件安装使用文档
一.安装Clamav杀毒工具 0.安装Clamav需要的依赖包 yum install libxml* openssl* -y 1.创建clamav组 groupadd clamav 2.创建clam ...
- Network - 互联网协议简介
珠玉在前,不在赘言 互联网协议入门(一) 互联网协议入门(二) 通信协议:HTTP.TCP.UDP 互联网协议入门 互联网协议入门深入 当你输入一个网址,实际会发生什么? Wireshark基本介绍和 ...
- python中的变量和算数运算
先说下变量的作用: 用来保存数据,为什么要保存? 后面要使用. 变量的概念: 变量就是用来存储一些信息,供程序以后调用或者操作修改.变量为标记数据提供了一种描述性的名字,以便我们的程序可以被程序的阅读 ...
- :nth-child(n)选择器
p:nth-child(n) 选择属于父元素的第n个子元素的每个p标签