Description

给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 998244353的结果

Solution

考虑 \(O(n^2)\) DP

枚举出度为 \(0\) 的点,构成的新\(DAG\)方案数为

\(f[i]=f[i-1]*C_{n}^{1}*2^{n-1}\)

即从 \(n\) 个点中选出一个点,作为出度为 \(0\) 的点,然后剩下 \(n-1\) 个点向这个点任意连边

但是 \(f[i-1]\) 中也会有出度为 \(0\) 的点,那么就算重了,考虑容斥这个算重的东西

\(f[n]=\sum_{i=1}^{n}(-1)^{i+1}**f[i-j]*C_{i}^{j}*2^{j*(i-j)}\)

即至少有一个出度为 \(0\) 的点-至少有两个的+....

这个式子可以 分治+\(NTT\) 优化

只需要拆 \(2^{j*(i-j)}\) 这个东西就行了



\(\sqrt(2)\) 的逆元可以枚举求出来

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=4e5+10,G=116195171,mod=998244353;
inline int qm(int x,ll k){
int sum=1;
while(k){
if(k&1)sum=1ll*sum*x%mod;
x=1ll*x*x%mod;k>>=1;
}
return sum;
}
inline int inv(int x){return qm(x,mod-2);}
int n,m,R[N];
inline void NTT(int *A){
for(int i=0;i<n;i++)if(i<R[i])swap(A[i],A[R[i]]);
for(int i=1;i<n;i<<=1){
int t0=qm(3,(mod-1)/(i<<1)),x,y;
for(int j=0;j<n;j+=i<<1){
int t=1;
for(int k=0;k<i;k++,t=1ll*t*t0%mod){
x=A[j+k];y=1ll*t*A[j+k+i]%mod;
A[j+k]=(x+y)%mod;A[j+k+i]=(x-y+mod)%mod;
}
}
}
}
inline void mul(int *A,int *B){
NTT(A);NTT(B);
for(int i=0;i<=n;i++)A[i]=1ll*A[i]*B[i]%mod;
NTT(A);
reverse(A+1,A+n);
for(int i=0,t=inv(n);i<=n;i++)A[i]=1ll*A[i]*t%mod;
}
int Fac[N],Finv[N],Gac[N],Ginv[N],a[N],b[N],f[N];
void priwork(int n){
Fac[0]=Finv[0]=Gac[0]=Ginv[0]=1;
for(int i=1;i<=n;i++){
Fac[i]=1ll*Fac[i-1]*i%mod;
Finv[i]=inv(Fac[i]);
Gac[i]=qm(G,1ll*i*i);
Ginv[i]=inv(Gac[i]);
}
}
inline void solve(int l,int r){
if(l==r)return ;
int mid=(l+r)>>1,L;
solve(l,mid);
m=r-l+1;
for(n=1,L=0;n<=m;n<<=1)L++;
for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(L-1)),a[i]=b[i]=0;
for(int i=l;i<=mid;i++)a[i-l]=f[i];
for(int i=1,o=1?1:-1;i<m;i++,o=-o){
b[i]=1ll*o*Finv[i]*Ginv[i]%mod;
if(b[i]<0)b[i]+=mod;
}
mul(a,b);
for(int i=mid+1;i<=r;i++)f[i]=(f[i]+a[i-l])%mod;
solve(mid+1,r);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
int n;cin>>n;
priwork(n);f[0]=1;
solve(0,n);
f[n]=1ll*f[n]*Fac[n]%mod*Gac[n]%mod;
printf("%d\n",f[n]);
return 0;
}

最新文章

  1. Maven的pom报maven-surefire-plugin:pom:2.12.4
  2. Linux哲学思想--基本法则
  3. Call to undefined function Think\mb_strlen()
  4. //build-&gt;//learn-&gt;//publish
  5. 学习 ---- JavaScript 高级设计程序 第三章(数据类型)
  6. ko 简单例子
  7. Oracle 性能查看
  8. Form的用法
  9. C#操作Excel(读/写)
  10. 93.Restore IP Addresses(M)
  11. 04-Python入门学习-流程控制
  12. 使用纳米 Protocol buffers 作为序列化数据
  13. 2018/12/19 20:55:58 螺纹钢豆粕PTA
  14. ModuleNotFoundError: No module named &#39;win32api&#39;
  15. php 三元运算符实例详细介绍
  16. python模块之xlwt
  17. python错误 ImportError: No module named setuptools 解决方法[转]
  18. OC - 缓存 - NSCache - 介绍
  19. [转]数据库中Schema(模式)概念的理解
  20. MapReduce的原理及执行过程

热门文章

  1. base64编码问题
  2. 高德地图之c#后台获取一个或多个起点到单个终点的直线距离
  3. ANE-IOS与AS的互通
  4. 2.ECMAScript 5.0
  5. Vagrant更改默认的SSH端口
  6. form在模版中的渲 染方式
  7. 2017qcon大会的一点想法(安全人才如何不被淘汰?)
  8. 【线程】结果缓存实现(future与concurrenthashmap)
  9. TCP 的保活定时器
  10. git 修改配置