题面

题目描述

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

输入格式

一个正整数n

输出格式

一个数,表示答案

样例输入

3

样例输出

25

数据范围和约定

对于第i个点 1<=n<=10000*i

增大了数据范围。

题目分析

COGS2353 【HZOI2015】有标号的DAG计数 I升级版。

在这道题的基础上继续往下化:

\[\begin{split}
f(n)&=\sum_{i=1}^n\frac {n!}{(n-i)!\cdot i!}\cdot(-1)^{i+1}\cdot f(n-i)\cdot2^{(n-i)\cdot i}\\
\frac{f(n)}{n!}&=\sum_{i=1}^n\frac{(-1)^{i+1}}{i!}\cdot \frac{f(n-i)}{(n-i)!}\cdot2^{(n-i)\cdot i}
\end{split}
\]

一个套路

\[\begin{split}
2^{k(n-k)}&=\sqrt{2}^{2kn-2k^2}\\
&=\sqrt{2}^{-n^2+2kn-k^2-k^2+n^2}\\
&=\sqrt{2}^{n^2-k^2-(n-k)^2}\\
&=\frac{\sqrt{2}^{n^2}}{\sqrt{2}^{k^2}\sqrt{2}^{(n-k)^2}}
\end{split}
\]

所以

\[\frac{f(n)}{n!\sqrt2^{n^2}}=\sum_{i=1}^n\frac{(-1)^{i+1}}{i!\sqrt2^{i^2}}\cdot \frac{f(n-i)}{(n-i)!\sqrt2^{(n-i)^2}}
\]

构造生成函数

\[\begin{split}
F(x)&=\sum_{i=1}\frac{f(i)}{i!\sqrt 2^{i^2}}x^i\\
G(x)&=\sum_{i=1}\frac{(-1)^{i+1}}{i!\sqrt 2^{i^2}}x^i\\
\end{split}
\]

所以

\[\begin{split}
F&=F*G+1\\
F&=\frac 1{1-G}
\end{split}
\]

代码实现

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=400005,mod=998244353,qr2=116195171;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int ksm(int x,int k){
int ret=1;
while(k){
if(k&1)ret=1ll*ret*x%mod;
x=1ll*x*x%mod,k>>=1;
}
return ret;
}
void NTT(int *a,int x,int K){
static int rev[N],lst;
int n=1<<x;
if(n!=lst){
for(int i=0;i<n;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<x-1);
lst=n;
}
for(int i=0;i<n;i++)if(i<rev[i])swap(a[i],a[rev[i]]);
for(int i=1;i<n;i<<=1){
int tmp=i<<1,wn=ksm(3,(mod-1)/tmp);
if(K==-1)wn=ksm(wn,mod-2);
for(int j=0;j<n;j+=tmp){
int w=1;
for(int k=0;k<i;k++,w=(LL)w*wn%mod){
int x=a[j+k],y=(LL)w*a[i+j+k]%mod;
a[j+k]=(x+y)%mod;a[i+j+k]=(x-y+mod)%mod;
}
}
}
if(K==-1){
int inv=ksm(n,mod-2);
for(int i=0;i<n;i++)a[i]=(LL)a[i]*inv%mod;
}
}
void Inv(int *f,int *g,int len){
static int A[N];
if(len==1)return g[0]=ksm(f[0],mod-2),void();
Inv(f,g,len>>1),copy(f,f+len,A);
int x=log2(len<<1),n=1<<x;
fill(A+len,A+n,0),fill(g+(len>>1),g+n,0);
NTT(A,x,1),NTT(g,x,1);
for(int i=0;i<n;i++)g[i]=(mod+2-(LL)A[i]*g[i]%mod)*g[i]%mod;
NTT(g,x,-1),fill(g+len,g+n,0);
}
int a[N],b[N],fac[N];
int main(){
freopen("dag_count.in","r",stdin);
freopen("dag_count.out","w",stdout);
int n=Getint(),x=ceil(log2(n+1));
fac[0]=1;
for(int i=1;i<(1<<x);i++)fac[i]=(LL)fac[i-1]*i%mod;
a[0]=1;
for(int i=1;i<(1<<x);i++)
a[i]=(((i&1)?-1:1)*(LL)ksm(fac[i],mod-2)%mod*ksm(ksm(qr2,(LL)i*i%(mod-1)),mod-2)%mod+mod)%mod;
Inv(a,b,1<<x);
cout<<(LL)b[n]*fac[n]%mod*ksm(qr2,(LL)n*n%(mod-1))%mod;
return 0;
}

COGS2355 【HZOI2015】 有标号的DAG计数 II的更多相关文章

  1. 有标号的DAG计数 II

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

  2. cogs 2355. [HZOI 2015] 有标号的DAG计数 II

    题目分析 来自2013年王迪的论文<浅谈容斥原理> 设\(f_{n,S}\)表示n个节点,入度为0的点集恰好为S的方案数. 设\(g_{n,S}\)表示n个节点,入度为0的点集至少为S的方 ...

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

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

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

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

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

    [HZOI 2015] 有标号的DAG计数 II \(I\)中DP只有一个数组, \[ dp_i=\sum{i\choose j}2^{j(i-j)}dp_{i-j}(-1)^{j+1} \] 不会. ...

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

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

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

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

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

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

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

随机推荐

  1. linux 编译指定库、头文件的路径问题(转)

    1. 为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得 ...

  2. 3-Windows-CMD启动mysql服务-连接本地mysql服务-连接远程mysql服务

    转自: https://jingyan.baidu.com/article/84b4f565b77a5660f6da32d4.html 备注: 如果在连接远程mysql服务,无法连接时,可能是远程my ...

  3. echart 柱状图背景色设置

    方法一: series: [ { name: '1', type: 'bar', itemStyle: {//柱图背景色 color: '#111' }, data: list }, { name: ...

  4. C#跨线程访问(一) ---- SynchronizationContext

    一.SynchronizationContext顾名思义是同步上下文的意思.利用此对象可以实现线程间数据的同步.异步访问. 二.例子 class Program { static Thread _wo ...

  5. 标准 IO fgets与fputs 对文件的操作

    char *fgets(char *s, int size, FILE *stream); int fputs(const char *s, FILE *stream);   使用fgets从流中读取 ...

  6. TFS中的账号和GIT中的账号

    有些公司使用TFS来进行git的管理,这个时候很多人没有区分TFS中的账号和GIT的账号的区别:TFS的账号和GIT账号是两套不同的体系,使用TFS管理GIT GIT是不需要账号密码,但是必须在win ...

  7. 在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr。

    在jquery中应该使用prop方法来获取和设置checked属性,不应该使用attr. $("#checkAll").prop("checked", true ...

  8. leetcode-12周双周赛-5090-抛掷硬币

    题目描述: 二维dp: class Solution: def probabilityOfHeads(self, prob: List[float], target: int) -> float ...

  9. Linux如何删除特殊字符文件名或目录?

    通过文件的inode号删除文件 先用ls -i 找出要删除文件的inode 号 2ls -i |grep xxxxxx|awk '{print $2}'|xargs -i rm -f {} xxxxx ...

  10. delphi实现圆角窗体[转]

    procedure TForm1.FormCreate(Sender: TObject); var hr :thandle; begin hr:=createroundrectrgn(1,1,widt ...