【题解】有标号的DAG计数4
[HZOI 2015] 有标号的DAG计数 IV
我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并
参考【题解】P4841 城市规划(指数型母函数+多项式Ln),然后答案\(h_i\)母函数\(H(x)\)就这样解
由于
\]
则
\]
球\(\ln\)就好了
//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;  typedef long long ll;
inline int qr(){
      register int ret=0,f=0;
      register char c=getchar();
      while(c<48||c>57)f|=c==45,c=getchar();
      while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
      return f?-ret:ret;
}
namespace poly{
      const int maxn=1<<19|1;
      int a[maxn],b[maxn],A[maxn],B[maxn],r[maxn];
      int savlen;
      inline void getr(const int&len){
	    if(len==savlen)return;
	    int cnt=0;
	    for(register int t=1;t<len;t<<=1)++cnt;
	    for(register int t=1;t<len;++t)
		  r[t]=r[t>>1]>>1|(t&1)<<cnt>>1;
      }
      const int mod=998244353;
      const int g=3;
      inline int ksm(ll base,ll p){
	    register int ret=1;
	    for(base%=mod;p;p>>=1,base=1ll*base*base%mod)
		  if(p&1) ret=1ll*ret*base%mod;
	    return ret;
      }
      const int gi=ksm(3,mod-2);
      inline void NTT(int*a,const int&len,const int&tag){
	    getr(len);
	    for(register int t=1;t<len;++t)
		  if(r[t]>t) swap(a[t],a[r[t]]);
	    int *a1,*a0,s=g;
	    if(tag!=1) s=gi;
	    for(register int t=1,wn;t<len;t<<=1){
		  wn=ksm(s,(mod-1)/(t<<1));
		  for(register int i=0;i<len;i+=t<<1){
			a1=(a0=a+i)+t;
			for(register int j=0,w=1,tm;j<t;++j,++a1,++a0,w=1ll*w*wn%mod){
			      tm=1ll**a1*w%mod;
			      *a1=(*a0-tm)%mod;
			      *a0=(*a0+tm)%mod;
			      if(*a1<0)*a1+=mod;
			}
		  }
	    }
	    if(tag!=1)
		  for(register int t=0,in=ksm(len,mod-2);t<len;++t)
			a[t]=1ll*a[t]*in%mod;
      }
      void INV(int*a,int*b,const int&len){
	    if(len==1){b[0]=ksm(a[0],mod-2);return;}
	    INV(a,b,len>>1);
	    for(register int t=0;t<len;++t) A[t]=a[t],B[t]=b[t];
	    NTT(A,len<<1,1);NTT(B,len<<1,1);
	    for(register int t=0,w=len<<1;t<w;++t) A[t]=1ll*A[t]*B[t]%mod*B[t]%mod;
	    NTT(A,len<<1,-1);
	    for(register int t=0;t<len;++t) b[t]=((b[t]+b[t])%mod-A[t]+mod)%mod;
	    memset(A,0,sizeof A);
	    memset(B,0,sizeof B);
      }
      inline void inter(int*a,int*b,const int&len){
	    for(register int t=len;t;--t)
		  b[t]=1ll*a[t-1]*ksm(t,mod-2)%mod;
	    b[0]=0;
      }
      inline void dev(int*a,int*b,const int&len){
	    for(register int t=0;t<len-1;++t)
		  b[t]=1ll*a[t+1]*(t+1)%mod;
	    b[len-1]=0;
      }
      inline void LN(int*a,int*b,const int&len){
	    static int C[maxn];
	    memset(C,0,sizeof C);
	    INV(a,b,len);
	    dev(a,C,len);
	    NTT(C,len<<1,1);
	    NTT(b,len<<1,1);
	    for(register int t=0;t<len<<1;++t) b[t]=1ll*b[t]*C[t]%mod;
	    NTT(b,len<<1,-1);
	    inter(b,C,len);
	    for(register int t=0;t<len;++t) b[t]=C[t];
      }
}
int g[1<<19|1],f[1<<19|1];
int jc[100005];
int inv[100005];
int n;
const int mod=998244353;
int main(){
      freopen("dagIV.in","r",stdin);
      freopen("dagIV.out","w",stdout);
      n=qr();
      jc[0]=1;
      inv[0]=1;
      for(register int t=1;t<=n;++t)
	    jc[t]=1ll*jc[t-1]*t%mod;
      using poly::ksm;
      inv[n]=ksm(jc[n],mod-2);
      for(register int t=n-1;t;--t) inv[t]=1ll*(t+1)*inv[t+1]%mod;
      for(register int t=1;t<=n;++t){
	    g[t]=1ll*ksm(ksm(2,1ll*t*(t-1)/2),mod-2)*inv[t]%mod;
	    if(t&1) g[t]=mod-g[t];
      }
      g[0]=1;
      int k=1;
      while(k<=n+2)k<<=1;
      poly::INV(g,f,k);
      memset(g,0,sizeof g);
      for(register int t=1;t<=n;++t)
	    g[t]=1ll*ksm(2,1ll*t*(t-1)/2)%mod*f[t]%mod;
      g[0]=1;
      memset(f,0,sizeof f);
      //cout<<endl;
      poly::LN(g,f,k);
      //for(register int t=0;t<k;++t) cout<<f[t]<<' ';
      printf("%lld\n",1ll*jc[n]*f[n]%mod);
      return 0;
}
												
											【题解】有标号的DAG计数4的更多相关文章
- 【题解】有标号的DAG计数3
		
[HZOI 2015] 有标号的DAG计数 III 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln), ...
 - 【题解】有标号的DAG计数1
		
[HZOI 2015] 有标号的DAG计数 I 设\(f_i\)为\(i\)个点时的DAG图,(不必联通) 考虑如何转移,由于一个DAG必然有至少一个出度为\(0\)的点,所以我们钦定多少个出度为\( ...
 - 【题解】有标号的DAG计数2
		
[HZOI 2015] 有标号的DAG计数 II \(I\)中DP只有一个数组, \[ dp_i=\sum{i\choose j}2^{j(i-j)}dp_{i-j}(-1)^{j+1} \] 不会. ...
 - 有标号的DAG计数(FFT)
		
有标号的DAG计数系列 有标号的DAG计数I 题意 给定一正整数\(n\),对\(n\)个点有标号的有向无环图(可以不连通)进行计数,输出答案\(mod \ 10007\)的结果.\(n\le 500 ...
 - COGS2356 【HZOI2015】有标号的DAG计数 IV
		
题面 题目描述 给定一正整数n,对n个点有标号的有向无环图进行计数. 这里加一个限制:此图必须是弱连通图. 输出答案mod 998244353的结果 输入格式 一个正整数n. 输出格式 一个数,表示答 ...
 - COGS2355 【HZOI2015】 有标号的DAG计数 II
		
题面 题目描述 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 998244353的结果 输入格式 一个正整数n 输出格式 一个数,表示答案 样例输入 3 样例输出 ...
 - COGS 2353 2355 2356 2358 有标号的DAG计数
		
不用连通 枚举入度为0的一层 卷积 发现有式子: 由$n^2-i^2-(n-i)^2=2*i*(n-i)$ 可得$2^{i*(n-i)}=\frac{{\sqrt 2}^{(n^2)}}{{\sqrt ...
 - 有标号的DAG计数 III
		
Description 给定一正整数n,对n个点有标号的有向无环图进行计数,这里加一个限制:此图必须是弱连通图.输出答案 mod 10007 的结果. Solution 弱连通图即把边变成无向之后成为 ...
 - 有标号的DAG计数 II
		
Description 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 998244353的结果 Solution 考虑 \(O(n^2)\) DP 枚举出度为 \( ...
 
随机推荐
- 在 windows 安装 Jekyll
			
本文告诉大家一个简单的方法在 Windows 安装 Jekyll 下载 ps1 文件 首先需要安装 Chocolatey ,这个工具可以快速安装 Jekyll 先下载Chocolatey,如果无法从这 ...
 - vue init定制团队模板之meta.js/meta.json写法入门
			
在上一篇文章中,我们提到了meta.js,这次我们详细了解一下meta.js里面各个模块的写法. 对于 meta.js/metajson 文件, 目前主要字段如下: prompts<Object ...
 - H3C 网络号和主机号
 - Keras框架下的保存模型和加载模型
			
在Keras框架下训练深度学习模型时,一般思路是在训练环境下训练出模型,然后拿训练好的模型(即保存模型相应信息的文件)到生产环境下去部署.在训练过程中我们可能会遇到以下情况: 需要运行很长时间的程序在 ...
 - 谷歌浏览器中kindeditor编译器字体不能为微软雅黑的问题?
			
https://segmentfault.com/q/1010000006204144 比如说用谷歌浏览器打开后台编译文章,在文章先选择字体为微软雅黑,再编辑其他,哪个字体就变成了": ...
 - java final域
			
public final class ThreeStooges { /* * stooges是Set<String>类型的引用,final限定该引用成员属性stooges被赋初值后,就不能 ...
 - tensorflow学习笔记(四十五):sess.run(tf.global_variables_initializer()) 做了什么?
			
当我们训练自己的神经网络的时候,无一例外的就是都会加上一句 sess.run(tf.global_variables_initializer()) ,这行代码的官方解释是 初始化模型的参数.那么,它到 ...
 - Java日志框架——JCL
			
JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging". 一.JCL原理 1.基本原理 JC ...
 - SpringBoot+Thyemleaf开发环境正常,打包jar发到服务器就报错Template might not exist or might not be accessible
			
网上查看了各种解决的思路,总结如下: 1. 在controller层请求处理完了返回时,没有使用@RestController或@ResponseBody而返回了非json格式 这种情况下返回的数据t ...
 - python基础十四之匿名函数
			
匿名函数 处理简单问题的简化函数,关键字lambda. # 格式:函数名 = lambda 参数:返回值 anonymity = lambda s: s ** 0.5 print(anonymity( ...