题解:AT_abc411_g [ABC411G] Count Cycles
xuanfeng101 · · 题解
前言
相似原题 CF11D,本质上就是一题。
题解
首先观察到点数
那么我们就可以设
其中,
到这里,本题基本上也就做完了,不过需要注意的是这样统计会有一条边连接两个点的情况,所以答案减去边数再除以
时间复杂度
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 21, P = 998244353;
int f[1 << N][21];
int st[N][N], n, m;
int ans;
int lowbit(int x)
{
return x & -x;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= m; i ++ )
{
int a, b;
cin >> a >> b;
a -- , b -- ;
st[a][b] ++ , st[b][a] ++ ;
}
for (int i = 0; i < n; i ++ ) f[1 << i][i] = 1;
for (int i = 0; i < 1 << n; i ++ )
for (int j = 0; j < n; j ++ )
{
if (!f[i][j]) continue;
for (int k = 0; k < n; k ++ )
{
if (!st[k][j] || lowbit(i) > (1 << k)) continue;
if (lowbit(i) == (1 << k)) ans = (ans + f[i][j] * st[k][j] % P) % P;
else if (!(i & (1 << k))) f[i | (1 << k)][k] = (f[i | (1 << k)][k] + f[i][j] * st[k][j] % P) % P;
}
}
cout << (((ans - m) % P + P) * 499122177 % P) % P;
return 0;
}