在 $< n$ 的数中能被 $x$ 整除的数的个数为 $(n - 1) / x$
在 $< n$ 的数中能被 $x, y$ 整除的数的个数为 $(n - 1) / lcm(x, y)$
......
考虑容斥
$Answer = sum_{i = 1} ^ {tot} (-1) ^ {(i + 1)} (n - 1) / (A 集合中任意 i 个数的 lcm)$
#include <iostream> #include <cstdio> using namespace std; const int N = 30; int A[N], n, m; int ans, tot; int Gcd(int a, int b) {return b == 0 ? a : Gcd(b, a % b);} void Dfs(int pos, int pre_lcm, int k) { for(int i = pos + 1; i <= tot; i ++) { int lcm = pre_lcm / Gcd(pre_lcm, A[i]) * A[i]; if(k & 1) ans += (n - 1) / lcm; else ans -= (n - 1) / lcm; Dfs(i, lcm, k + 1); } } int main() { while(scanf("%d%d", &n, &m) == 2) { ans = 0, tot = 0; for(int i = 1; i <= m; i ++) { int x; scanf("%d", &x); if(x > 0 && x < n) A[++ tot] = x; } Dfs(0, 1, 1); cout << ans << " "; } return 0; }