【题解】有标号的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 枚举出度为 \( ...
随机推荐
- 08Redis入门指南笔记(集群)
即使使用哨兵,此时的 Redis 集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于所有节点中,内存最小的数据库节点,形成木桶效应. 对 Redis 进行水平扩容,在旧版Red ...
- ashx不能折叠代码,没有智能提示
visual studio 2013有时候会遇到这个问题.没安装任何第三方插件,创建的是web网站项目.ashx文件忽然就没有intelligent智能提示了. 可以试试: 关闭visual stud ...
- selenium webdriver学习(七)------------如何处理alert、confirm、prompt对话框( 转)
selenium webdriver学习(七)------------如何处理alert.confirm.prompt对话框 博客分类: Selenium-webdriver alertpromptc ...
- 传说中Python最难理解的点|看这完篇就够了(装饰器)
https://mp.weixin.qq.com/s/B6pEZLrayqzJfMtLqiAfpQ 1.什么是装饰器 网上有人是这么评价装饰器的,我觉得写的很有趣,比喻的很形象 每个人都有的内裤主要是 ...
- 很奇怪的问题(Chrome)
<p>感觉这个问题跟Chrome浏览器本身的一些策略有关.</p> 在我写完登录页面后 准备美滋滋的登录验证下的时候,确一直卡在数据获取上了,查看NetWork,发现是Chro ...
- 2019-8-31-dotnet-将文件删除到回收站
title author date CreateTime categories dotnet 将文件删除到回收站 lindexi 2019-08-31 16:55:58 +0800 2019-03-2 ...
- H3C 分组交换连接模型
- js获取盒子scrollTop
前言:如何单纯获取某个盒子的滚动值-->> (属性可写可读) var scroll = document.getElementById('box').scrollTop;//获取盒子的滚 ...
- Python--day21--复习
序列化模块总结: jison格式化输出: Serialize obj to a JSON formatted str.(字符串表示的json对象) Skipkeys:默认值是False,如果dict的 ...
- H3C PAP验证配置示例