AT2390 [AGC016F] Games on DAG

题目链接

显然我们只要求 \(1,2\) 号点的 SG 函数相同的情况数就可以了。

考虑 SG 的运算 mex,其中 \(0\) 即为特殊。我们可以枚举 DAG 上的 \(SG(x)=0\) 的点是什么,这样的话这些点之间就不能连边,且其余的点中每个点都至少要向这些点连一条边。然后发现其余的点的连边情况是个子问题,于是直接DP即可。

复杂度:\(O(n3^n)\)

inline ll calc1(int s, int t) {
	ll res = 1;
	for (int i = 0; i < n; ++i) if ((s >> i) & 1) {
		res = 1ll * res * mi[ecnt[i][t]] % P;
	}
	return res;
}
inline ll calc2(int s, int t) {
	ll res = 1;
	for (int i = 0; i < n; ++i) if ((s >> i) & 1) {
		res = 1ll * res * (mi[ecnt[i][t]] - 1) % P;
	}
	return res;
}
int f[NNN];
inline void work() {
	f[0] = 1;
	for (int s = 1; s <= All; ++s) if ((s & 1) == ((s >> 1) & 1)) {
		for (int t = s; t; t = (t - 1) & s) {
			f[s] = (f[s] + 1ll * calc1(t, s ^ t) * calc2(s ^ t, t) % P * f[s ^ t] % P) % P;
		}
	}
	ll ans = (mi[m] - f[All]) % P;
	printf("%lld\n", (ans % P + P) % P);
}
posted @ 2020-09-21 10:06  JiaZP  阅读(150)  评论(0编辑  收藏  举报