社区讨论

dfs mle

P1036[NOIP 2002 普及组] 选数参与者 4已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhj9hnmr
此快照首次捕获于
2025/11/03 22:55
4 个月前
此快照最后确认于
2025/11/03 22:55
4 个月前
查看原帖
CPP
#include<iostream>
#include<algorithm>
using namespace std;
#define int long long
const int maxx = 5e8;
int n, m, k[30],cnt,p[100001];
bool prime[maxx];
void isprime(int x)
{
	for (int i = 2; i <= x; i++)
	{
		if (!prime[i]) p[++cnt] = i;
		for (int j = 1; j <= cnt && p[j] * i <= x; j++)
		{
			prime[i * p[j]] = 1;
			if(i % p[j] == 0)
				break;
		}
	}
}
int ans[30],q;
void dfs(int x)
{
	if (x == m + 1)
	{
		int sum = 0;
		for (int i = 1; i <= m; i++)
		{
			sum += ans[i];
		}
		if (!prime[sum])
		{
			q++;
		}
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (ans[x - 1] >= k[i] && x!=1)
			continue;
		ans[x] = k[i];
		dfs(x + 1);
		ans[x] = 0;
	}
}

signed main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		cin >> k[i];
	isprime(maxx);
	sort(k + 1, k + n + 1);
	dfs(1);
	cout << q;
	return 0;
}

回复

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

正在加载回复...