题解:P10982 Connected Graph
wangbinfeng · · 题解
考虑到,
对于
对于
按照转移方程实现即可,时间复杂度 long long 存储。
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1000 + 9, mod = 1004535809LL;
int n, pw[maxn * maxn], c[maxn][maxn], f[maxn];
signed main()
{
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
cin >> n, pw[0] = 1;
for (int i = 1; i <= n * n; i++)
pw[i] = pw[i - 1] * 2 % mod; // O(n) 预处理出 2 的若干次方
for (int i = 0; i <= n; i++) // 预处理出组合数
for (int j = 0; j <= i; j++)
if (!j)
c[i][j] = 1;
else
c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
for (int i = 1; i <= n; i++)
{
f[i] = pw[i * (i - 1) / 2];
for (int j = 1; j < i; j++)
f[i] = (f[i] - f[j] * c[i - 1][j - 1] % mod * pw[(i - j) * (i - j - 1) / 2] % mod + mod) % mod;
}
cout << f[n];
}