社区讨论

暴力代码求条

P8867[NOIP2022] 建造军营参与者 2已保存回复 13

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
13 条
当前快照
1 份
快照标识符
@m3mt96ml
此快照首次捕获于
2024/11/18 17:15
去年
此快照最后确认于
2025/11/04 23:31
4 个月前
查看原帖
1~ 3 10~11数据
期望得分 25 实际得分 10
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1000000007ll, N = 1000010, M = 10010;
int n, m, u[N], v[N], f[N], ans, ff[M], k;
vector <int> e[M], l;
queue <int> q;
int check()
{
	q.push(l[0]);
	int x;
	for (int i = 1; i <= n; i++)
		ff[i] = 0;
	ff[l[0]] = 1;
	while(!q.empty())
	{
		x = q.front();
		q.pop();
		for (auto i : e[x])
		{
			if (ff[i] == 0)
			{
				q.push(i);
				ff[i] = 1;
			}
		}
	}
	for (auto i : l)
		if (!ff[i])
			return 0;
	return 1;
}
int dfs2(int i)
{
	if (i > m)
		return check();
	int anss = dfs2(i + 1);
	e[u[i]].push_back(v[i]);
	e[v[i]].push_back(u[i]);
	anss += dfs2(i + 1);
	e[u[i]].pop_back();
	e[v[i]].pop_back();
	return anss;
}
int dfs(int x)
{
	if (x > n)
		return dfs2(1);
	l.push_back(x);
	int anss = dfs(x + 1);
	l.pop_back();
	if (x == n && l.size() == 0)
		return anss;
	return anss + dfs(x + 1);
}
signed main()
{
	cin >> n >> m;
	for (int i = 1; i <= m; i++)
		scanf("%lld%lld", u + i, v + i);
	if (n > 100)
	{
		f[0] = 1;
		for (int i = 1; i <= n; i++)
			f[i] = (f[i - 1] << 1ll) % mod;
		for (int i = 1; i <= n; i++)
			(ans += (f[n - i] * f[max(0ll, i - 2)] % mod) * (n - i + 1) % mod) %= mod;
		printf("%lld", ans);
		return 0;
	}
	printf("%lld", dfs(1));
}

回复

13 条回复,欢迎继续交流。

正在加载回复...