[HZOI 2015] 有标号的DAG计数 II

\(I\)中DP只有一个数组,

\[dp_i=\sum{i\choose j}2^{j(i-j)}dp_{i-j}(-1)^{j+1}
\]

不会...

傻啊直接多项式球逆,借鉴一些luogu那道模板分治FFT

这里主要有个很烦人的\(ji-j^2\),现在要构造成\(j,i-j,i\)的的形式就好了,神tst告诉我们

\[ij = \binom{i}{2} + \binom{j+1}{2} - \binom{i-j}{2}=\dfrac {i(i-1)+j(j+1)-(i-j)(i-j-1)}{2}
\]

带进去,化简

\[\frac{f_i}{i!2^\binom{i}{2}} = \sum\limits_{j=1}^i \dfrac{(-1)^{j+1}}{j!2^\binom{j}{2}} \dfrac{f_{i-j}}{(i-j)!2^\binom{i-j}{2}}
\]

设\(F(x)=\sum \dfrac{f_i}{i!2^\binom{i}{2}} x^i\),\(H(x)=\sum \dfrac{(-1)^{j+1}}{j!2^\binom{j}{2}}x^j\) 上式等价于

\[F(x)=G(x)(F(x)-1)
\]

直接球逆得到 \(G(x)\)

//@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<<18|1;
int r[maxn];
int savcnt;
inline void getr(const int&len){
if(len==savcnt)return;
savcnt=len;
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(const int&base,const ll&p){
register int ret=1;
for(register ll t=p,b=base%mod;t;t>>=1,b=1ll*b*b%mod)
if(t&1) ret=1ll*ret*b%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=0;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 k=0,w=1,m;k<t;++k,++a1,++a0,w=1ll*w*wn%mod){
m=1ll*w**a1%mod;
*a1=(*a0+mod-m)%mod;
*a0=(*a0 +m)%mod; }
}
}
if(tag!=1)
for(register int t=0,w=ksm(len,mod-2);t<len;++t)
a[t]=1ll*a[t]*w%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);
static int A[maxn],B[maxn];
for(register int t=0;t<len<<1;++t) A[t]=B[t]=0;
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;t<len<<1;++t) B[t]=1ll*A[t]*B[t]%mod*B[t]%mod;
NTT(B,len<<1,-1);
for(register int t=0;t<len;++t) b[t]=((b[t]+b[t])%mod+mod-B[t])%mod; } } int g[1<<19|1],f[1<<19|1];
int jc[100005];
int inv[100005];
int n;
const int mod=998244353;
int main(){
freopen("dag_count.in","r",stdin);
freopen("dag_count.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)k<<=1;
poly::INV(g,f,k);
printf("%lld\n",1ll*jc[n]*ksm(2,1ll*n*(n-1)/2)%mod*f[n]%mod);
return 0;
}

【题解】有标号的DAG计数2的更多相关文章

  1. 【题解】有标号的DAG计数4

    [HZOI 2015] 有标号的DAG计数 IV 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln),然 ...

  2. 【题解】有标号的DAG计数3

    [HZOI 2015] 有标号的DAG计数 III 我们已经知道了\(f_i\)表示不一定需要联通的\(i\)节点的dag方案,考虑合并 参考[题解]P4841 城市规划(指数型母函数+多项式Ln), ...

  3. 【题解】有标号的DAG计数1

    [HZOI 2015] 有标号的DAG计数 I 设\(f_i\)为\(i\)个点时的DAG图,(不必联通) 考虑如何转移,由于一个DAG必然有至少一个出度为\(0\)的点,所以我们钦定多少个出度为\( ...

  4. 有标号的DAG计数(FFT)

    有标号的DAG计数系列 有标号的DAG计数I 题意 给定一正整数\(n\),对\(n\)个点有标号的有向无环图(可以不连通)进行计数,输出答案\(mod \ 10007\)的结果.\(n\le 500 ...

  5. COGS2356 【HZOI2015】有标号的DAG计数 IV

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图进行计数. 这里加一个限制:此图必须是弱连通图. 输出答案mod 998244353的结果 输入格式 一个正整数n. 输出格式 一个数,表示答 ...

  6. COGS2355 【HZOI2015】 有标号的DAG计数 II

    题面 题目描述 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 998244353的结果 输入格式 一个正整数n 输出格式 一个数,表示答案 样例输入 3 样例输出 ...

  7. 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 ...

  8. 有标号的DAG计数 III

    Description 给定一正整数n,对n个点有标号的有向无环图进行计数,这里加一个限制:此图必须是弱连通图.输出答案 mod 10007 的结果. Solution 弱连通图即把边变成无向之后成为 ...

  9. 有标号的DAG计数 II

    Description 给定一正整数n,对n个点有标号的有向无环图(可以不连通)进行计数,输出答案mod 998244353的结果 Solution 考虑 \(O(n^2)\) DP 枚举出度为 \( ...

随机推荐

  1. @loj - 2174@ 「FJOI2016」神秘数

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个可重复数字集合 S 的神秘数定义为最小的不能被 S 的子集的 ...

  2. Bert源码阅读

    前言 对Google开源出来的bert代码,来阅读下.不纠结于代码组织形式,而只是梳理下其训练集的生成,训练的self-attention和multi-head的具体实现. 训练集的生成 主要实现在c ...

  3. Logback设置SQL参数打印

    一.hibernate中设置SQL参数打印: (主要是第一句) <logger name="org.hibernate.type.descriptor.sql.BasicBinder& ...

  4. webkit浏览器下多行显示,有省略号效果

    多行显示情况 display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; ...

  5. 2003年NOIP普及组复赛题解

    题目涉及算法: 乒乓球:简单字符串模拟: 数字游戏:区间DP: 栈:卡特兰数 麦森数:高精度.快速幂.数学. 乒乓球 题目链接:https://www.luogu.org/problem/P1042 ...

  6. Java中方法的格式

    [修饰符] 返回值类型 方法名([参数类型 形式参数1,参数类型 形式参数2,……]) {             执行语句;     [return 返回值;]//需要的话 } 参数列表(参数的类型 ...

  7. Python--day36--操作系统的作用;多道技术;

  8. 关于Ping和Tracert命令原理详解

    本文只是总结了两个常用的网络命令的实现原理和一点使用经验说明.这些东西通常都分布在各种书籍或者文章中的,我勤快那么一点点,总结一下,再加上我的一点理解和使用经验,方便大家了解.这些也是很基础的东西,没 ...

  9. Codeforces Round #564 (Div. 2)

    传送门 参考资料 [1]: the Chinese Editoria A. Nauuo and Votes •题意 x个人投赞同票,y人投反对票,z人不确定: 这 z 个人由你来决定是投赞同票还是反对 ...

  10. P1068 压缩技术

    题目描述 设某汉字由N × N的0和1的点阵图案组成. 我们依照以下规则生成压缩码.连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从左到右,由上至下.第一个数表示连续有几个0,第二 ...