AcWing 890. 能被整除的数 (容斥原理)
给定一个整数 n 和 m 个不同的质数 p1,p2,…,pm。
请你求出 1∼n 中能被 p1,p2,…,pm 中的至少一个数整除的整数有多少个。
输入格式
第一行包含整数 n 和 m。
第二行包含 m 个质数。
输出格式
输出一个整数,表示满足条件的整数的个数。
数据范围
1≤m≤16,
1≤n,pi≤109
输入样例:
10 2
2 3
输出样例:
7
b站上很清楚的容斥原理的演示
三集合容斥原理_哔哩哔哩_bilibili
答案是对集合长度 :奇数加,偶数减
dfs写法:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<deque>
#include<stack>
#include<unordered_set>
#include<set>
#include<map>
#include<unordered_map>
#include<bitset>
#include<tuple>
#define inf 1152921504606846977
#define int long long
#define endl '\n'
#define F first
#define S second
using namespace std;
typedef pair<int, int> pii;const int N = 210, mod = 998244353;int n, m;
int res = 0;
int a[N];void dfs(int u, int st, int r, int k) {if (u == k + 1) {if (k & 1) res += n / r;else res -= n / r;return;}for (int i = st; i <= m; i++) {if (r > n / a[i]) continue;dfs(u + 1, i + 1, r * a[i], k);}}void solve() {cin >> n >> m;for (int i = 1; i <= m; i++) {cin >> a[i];}for (int i = 1; i <= m; i++) {dfs(1, 1, 1, i);}cout << res << endl;
}signed main() {ios::sync_with_stdio(false);cin.tie(nullptr), cout.tie(nullptr);int T = 1;
// cin >> T;while (T--) solve();return 0;
}