bzoj 4555 [Tjoi2016&Heoi2016]求和——NTT+第二类斯特林数
2024-09-04 05:36:50
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4555
第二类斯特林数展开式:
\( S(i,j) = \frac{1}{j!} \sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k}(j-k)^{i} \)
大概是容斥枚举空的盒子个数。https://www.cnblogs.com/gzy-cjoier/p/8426987.html
在这道题里,先把 j 提到前面,再把组合数展开,推一推式子发现 j 之后的那部分是卷积的形式。就能 O( nlogn + n )了。
别把 >>1 写成 <<1 !!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+,M=(<<)+,mod=;
int n,len,r[M],a[M],b[M],ans,jcn[N];
void upd(int &x){x>=mod?x-=mod:;x<?x+=mod:;}
int pw(int x,int k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;}
void ntt(int *a,bool fx)
{
for(int i=;i<len;i++)
if(i<r[i])swap(a[i],a[r[i]]);
for(int R=;R<=len;R<<=)
{
int Wn=pw( ,fx?(mod-)-(mod-)/R:(mod-)/R );
for(int i=,m=R>>;i<len;i+=R)
for(int j=,w=;j<m;j++,w=(ll)w*Wn%mod)
{
int x=a[i+j], y=(ll)w*a[i+m+j]%mod;
a[i+j]=x+y; upd(a[i+j]);
a[i+m+j]=x+mod-y; upd(a[i+m+j]);
}
}
if(!fx)return ; int inv=pw(len,mod-);
for(int i=;i<len;i++)a[i]=(ll)a[i]*inv%mod;
}
int main()
{
scanf("%d",&n);
jcn[]=;for(int i=;i<=n;i++)jcn[i]=(ll)jcn[i-]*i%mod;
jcn[n]=pw(jcn[n],mod-); for(int i=n-;i>=;i--)jcn[i]=(ll)jcn[i+]*(i+)%mod;
for(int i=,fx=;i<=n;i++,fx=-fx)
{
a[i]=fx*jcn[i]+mod;upd(a[i]);
}
for(int i=;i<=n;i++)
{
int k=-i;
if(!k)
{
b[i]=(ll)(n+)*jcn[i]%mod;
}
else
{
int d=pw(i,n+);
if(k<)k+=mod; k=pw(k,mod-);
b[i]=(ll)(+mod-d)*k%mod*jcn[i]%mod;
}
}
for(len=;len<=n<<;len<<=);
for(int i=;i<len;i++)r[i]=(r[i>>]>>)+((i&)?len>>:);//len>>1!! not <<1
ntt(a,); ntt(b,);
for(int i=;i<len;i++)a[i]=(ll)a[i]*b[i]%mod;
ntt(a,);
for(int i=,jc=,lj=;i<=n;i++,jc=(ll)jc*i%mod,lj<<=,upd(lj))
ans=(ans+(ll)lj*jc%mod*a[i])%mod;
printf("%d\n",ans);
return ;
}
最新文章
- fsr
- C语言 遍历流程 变量生命周期
- static 使用要注意的地方
- win7下给右键菜单添加启动cmd命令
- C#_wpf_userinput_数据绑定_后台对象改变,界面数据也变化
- linux(边压缩边传输边解压)
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- ThinkPHP 3.1.2 视图-1
- JSPatch技术文档
- svn checkout The XML response contains invalid XML
- SSH的软链接后门
- java 调用 api接口
- Ajax入门例子
- UVALive 4850 Installations 贪心
- FTP 错误1
- Python学习--Selenium模块学习(2)
- PAT 1066. Root of AVL Tree (25)
- 2. React组件的生命周期
- bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
- 如何使用Java Enum
热门文章
- GIT生成 SSH Key步骤
- 近年现场比赛补题(From 2013 to 2018)[持续更新]
- orecle触发器
- LVS+Keepalived+Tomcat实现高可用性及均衡负载
- 编写一个程序,将 d:\java 目录下的所有.java 文件复制到 d:\jad 目录下,并将原来文件的扩展名从.java 改为.jad。
- NVMe到底是什么?用它的SSD有啥优势?
- Tomcat中HTTP与AJP区别
- 51nod-1259-分块+dp
- 探究platform_driver中“多态”思想
- S5PV210启动过程详解1