mxqz状压dp
查看原帖
mxqz状压dp
858406
Cadmus楼主2022/12/2 21:58

https://www.luogu.com.cn/record/96337784

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 20, mod = 19260817;
int n, m, res, c, u, v, cnt[N][N], sum[1 << N], f[N][1 << N][2];
vector<int> G[N];
inline void upd(int& x, int y) {
	(x += y) >= mod ? x -= mod : 0;
}
signed main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i ++)
		cin >> u >> v, cnt[u][v] ++, cnt[v][u] ++, G[u].push_back(v), G[v].push_back(u);
	cin >> c;
	for (int i = 0; i < 1 << n; i ++)
		for (int j = 0; j < n; j ++)
			if (i & 1 << j) sum[i] += j + 1;
	f[1][1][0] = 1;
	for (int i = 1; i < 1 << n; i ++)
		for (int u = 1; u <= n; u ++)
			for (int v = 1; v <= n; v ++) {
				if (!cnt[u][v]) continue;
				if (i & 1 << (v - 1)) continue;
				int S = i | 1 << (v - 1);
				upd(f[v][S][(v * sum[i]) & 1], f[u][i][0] * cnt[u][v]);
				upd(f[v][S][(v * sum[i] + 1) & 1], f[u][i][1] * cnt[u][v]);
//				cout << u << ' ' << v << ' ' << i << ' ' << S << ' ' << f[v][S][(v * sum[i]) & 1] << '\n';
			}
	for (int i = 0; i < 1 << n; i ++)
		upd(res, f[n][i][c]);
	cout << res << '\n';
	return 0;
}
2022/12/2 21:58
加载中...