社区讨论

站外题求条

题目总版参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhjs3rn8
此快照首次捕获于
2025/11/04 07:36
4 个月前
此快照最后确认于
2025/11/04 07:36
4 个月前
查看原帖
问题描述
有 m m个质数: p1,p2,...,pm p1​,p2​,...,pm​。(可能有相同)
请你求出 1−n 1−n中有多少个数字 x x满足: x x至少是其中一个质数的倍数。 输入描述
第一行两个正整数 n,m n,m含义如描述。( 1≤n≤109 1≤n≤109, 1≤m≤16 1≤m≤16)
接下来一行 m m个质数 p1,p2,...,pm p1​,p2​,...,pm​。( 2≤pi≤109 2≤pi​≤109) 输出描述
在一行中输出满足条件的数字个数。 样例输入
10 2
2 3 样例输出
7 提示说明
满足条件的数字有:2 3 4 6 8 9 10,共 7 个。
41 pts:
CPP
#include <iostream>
//#include <iomanip>
#include <algorithm>
//#include <cmath>
//#include <climits>
//#include <cctype>
//#define int long long
#define fup(c, st, ed, f) for (int (c) = (st); (c) <= (ed); (c) += (f))
#define fdn(c, st, ed, f) for (int (c) = (st); (c) >= (ed); (c) -= (f))
#define FASTIO ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//#define save(x) fixed << setprecision(x)
using namespace std;
using ll = long long;
const int MAXN = 20;

int n, m, p[MAXN], ans;

signed main()
{
	cin >> n >> m;
	for (int i = 0; i < m; ++i) cin >> p[i];
	sort(p, p + m);
	int size = unique(p, p + m) - p;
	for (int i = 1; i < (1 << size); ++i)
	{
		int cnt = 0, lcmm = 1;
		for (int j = 0; j < size; ++j)
		{
			if ((1 << j) & i)
			{
				++cnt;
				lcmm *= p[j];
			}
		}
		if (cnt & 1) ans += n / lcmm;
		else ans -= n / lcmm;
	}
	cout << ans;
	return 0;
}
可以提供一组样例 hack 我。

回复

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

正在加载回复...