constint N = 20; int p[N]; int n, m; typedeflonglong LL; intmain() { cin >> n>> m; for (int i = 0; i < m; i ++) cin >> p[i]; int res = 0; // 枚举1 到 1111 ... m个 集合, for (int i= 1; i < 1 << m; i ++) { int t = 1; // 所选集合对应的质数乘积。 int s = 0; //所选集合的数量 for (int j = 0; j < m; j ++) if (i >> j & 1) { // 如果大于n,则说明在n中没有所选集合的最小公倍数 if ((LL)t * p[j] > n) { t = - 1; break; } t *= p[j]; s ++; } //如果t==-1,则说明在n中没有所选集合的最小公倍数 if (t == -1) continue; if (s & 1) res += n / t; // 根据公式可得, 奇数相加 else res -= n / t; //偶数相减 }