传送门.

题解:


4月YY集训时做过DAG计数,和这个基本上是一样的,但是当时好像直接暴力子集卷积,不然我省选时不至于不会,这个就多了个边不选的概率和子集卷积。

DAG计数是个套路来的,利用的是DAG中入度为0的点。

设\(f[S]\)表示只考虑s里的点的诱导子图形成DAG的方案数。

枚举一个\(T|S~\and~T=\empty\),这个T就是新的图中度数为0的点,首先它们之间要没有边,然后\(T\)和\(S\)间的边要么没有,要么都由\(T->S\),记\(cnt[S]\)表示S里的边数,这转移系数是:

\({1\over 3}^{g[T]}*{{2\over 3}^{g[S+T]}\over {2\over 3}^{g[S]+g{T}}}\)

注意这样会算重,因为会枚举到度数为0的点的子集,那么容斥系数\((-1)^{|T|+1}\),考虑用\(\sum_{i=1}^{|T|}(-1)^{i+1}*C_{|T|}^i=1\)来证明。

直接卷积是\(O(3^n)\),然后就上or FWT + 1的个数的老套路了,复杂度\(O(2^n*n^2)\)。

Code:


#include<bits/stdc++.h>
#define fo(i, x, y) for(int i = x, B = y; i <= B; i ++)
#define ff(i, x, y) for(int i = x, B = y; i < B; i ++)
#define fd(i, x, y) for(int i = x, B = y; i >= B; i --)
#define ll long long
#define pp printf
#define hh pp("\n")
using namespace std; const int mo = 998244353; ll ksm(ll x, ll y) {
ll s = 1;
for(; y; y /= 2, x = x * x % mo)
if(y & 1) s = s * x % mo;
return s;
} const ll w1 = ksm(3, mo - 2), w2 = 2 * ksm(3, mo - 2) % mo;
const ll nw1 = ksm(w1, mo - 2), nw2 = ksm(w2, mo - 2); const int N = 21; const int M = 1 << 20;
int n, m, x, y, a2[N];
int bz[N][N];
ll f[M], nf[M], g[M];
int cnt[M]; void dft(int *a, int n, int f) {
for(int h = 1; h < n; h *= 2) for(int j = 0; j < n; j += 2 * h) ff(i, 0, h) {
if(f == 1) a[i + j + h] = (a[i + j + h] + a[i + j]) % mo; else
a[i + j + h] = (a[i + j + h] - a[i + j]) % mo;
}
} int a[21][M], b[21][M]; int main() {
scanf("%d %d", &n, &m);
a2[0] = 1; fo(i, 1, n) a2[i] = a2[i - 1] * 2;
fo(i, 1, m) {
scanf("%d %d", &x, &y);
x --; y --;
bz[x][y] = 1;
}
ff(s, 1, a2[n]) cnt[s] = cnt[s - (s & -s)] + 1;
ff(s, 0, a2[n]) {
f[s] = g[s] = nf[s] = 1;
if(s == 0) continue;
int st;
ff(i, 0, n) if(s >> i & 1) { st = i;}
f[s] = f[s ^ (1 << st)];
g[s] = g[s ^ (1 << st)];
nf[s] = nf[s ^ (1 << st)];
ff(i, 0, st) if(s >> i & 1) {
if(bz[st][i]) f[s] = f[s] * w2 % mo, nf[s] = nf[s] * nw2 % mo, g[s] = g[s] * w1 % mo;
if(bz[i][st]) f[s] = f[s] * w2 % mo, nf[s] = nf[s] * nw2 % mo, g[s] = g[s] * w1 % mo;
}
}
fo(i, 1, n) {
ff(j, 0, a2[n]) if(cnt[j] == i)
b[i][j] = nf[j] * g[j] % mo * ((cnt[j] & 1) ? 1 : -1);
dft(b[i], a2[n], 1);
}
a[0][0] = 1; dft(a[0], a2[n], 1);
fo(w, 0, n) {
fo(j, 1, n - w) {
ff(i, 0, a2[n]) a[j + w][i] = ((ll) a[w][i] * b[j][i] + a[j + w][i]) % mo;
}
}
dft(a[n], a2[n], -1);
ll ans = a[n][a2[n] - 1];
ans = (ans % mo + mo) * f[a2[n] - 1] % mo;
pp("%lld\n", ans);
}

Comet Contest#11 F arewell(DAG计数+FWT子集卷积)的更多相关文章

  1. 有标号DAG计数 [容斥原理 子集反演 组合数学 fft]

    有标号DAG计数 题目在COGS上 [HZOI 2015]有标号的DAG计数 I [HZOI 2015] 有标号的DAG计数 II [HZOI 2015]有标号的DAG计数 III I 求n个点的DA ...

  2. CF838C(博弈+FWT子集卷积+多项式ln、exp)

    传送门: http://codeforces.com/problemset/problem/838/C 题解: 如果一个字符串的排列数是偶数,则先手必胜,因为如果下一层有后手必赢态,直接转移过去,不然 ...

  3. CF914G Sum the Fibonacci (快速沃尔什变换FWT + 子集卷积)

    题面 题解 这是一道FWT和子集卷积的应用题. 我们先设 cnt[x] 表示 Si = x 的 i 的数量,那么 这里的Nab[x]指满足条件的 Sa|Sb=x.Sa&Sb=0 的(a,b)二 ...

  4. 「CometOJ」Contest #11

    Link Aeon 显然字典序最大就是把最小的字母放在最后 Business [动态规划] 简单dp dp[i][j]dp[i][j]dp[i][j]表示到第iii天,当前有jjj块钱,最后返还的钱最 ...

  5. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  6. Comet OJ - Contest #11题解

    传送门 \(A\) 咕咕咕 const int N=1e6+5; char s[N],t[N];int n,res; inline bool cmp(const int &x,const in ...

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

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

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

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

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

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

随机推荐

  1. PHP数组函数实现栈与队列的方法介绍(代码示例)

    根据php提供的四个关于数组的函数: array_push(),array_pop(),array_unshift(),array_shift() 配合数组本身,一下子就实现了栈(stack)和队例( ...

  2. 理解CSV格式规范(解析CSV必备)

    什么是CSV逗号分隔值(Comma-Separated Values,CSV),其文件以纯文本形式存储表格数据(数字和文本),文件的每一行都是一个数据记录.每个记录由一个或多个字段组成,用逗号分隔.使 ...

  3. PHP发送公众号模板消息

    <?php /* * 模板消息发送,电脑端测试时需要手动填写openid * 微信端会自动获取当前openid发送无需填写 */ header("Content-type: text/ ...

  4. 「NOI2017」整数 解题报告

    「NOI2017」整数 有一些比较简单的\(\log^2n\)做法 比如暴力在动态开点线段树上维护每个位置为\(0\)还是\(1\),我们发现涉及到某一位加上\(1\)或者减去\(1\)实际上对其他位 ...

  5. javascript 对象的设计模式

    1.为什么学习设计模式:http://www.iteye.com/news/32092   或  https://blog.csdn.net/pigpigpig4587/article/details ...

  6. 在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程

    在angular4的项目中需要使用bootstrap的tooltip插件. 1. 使用命令安装jQuery和bootstrap npm install bootstrap jquery --save ...

  7. svm 之 线性可分支持向量机

    定义:给定线性可分训练数据集,通过间隔最大化或等价的求解凸二次规划问题学习获得分离超平面和分类决策函数,称为线性可分支持向量机. 目录: • 函数间隔 • 几何间隔 • 间隔最大化 • 对偶算法 1. ...

  8. 关于audio不能拖放

    图一,图二均为wav格式文件 图一为播放本地的音频,可以拖放 图二为放在后台的音频,不可以拖放 把这两个图片发给后台,让后台分析下两个的headers不同之处

  9. JS对象中属性的增删改查

    对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性 对象的分类:           1.内建对象                 -在ES标准中定义的对象,在任何的ES的实现中都可以 ...

  10. linux基础--目录介绍

    Windows和Linux文件系统区别 在 windows 平台下,打开“计算机”,我们看到的是一个个的驱动器盘符: 每个驱动器都有自己的根目录结构,这样形成了多个树并列的情形,如图所示: 在 Lin ...