给定一个整数 nn 和 mm 个不同的质数 p1,p2,…,pmp1,p2,…,pm。
请你求出 1∼n1∼n 中能被 p1,p2,…,pmp1,p2,…,pm 中的至少一个数整除的整数有多少个。

输入格式

第一行包含整数 nn 和 mm。
第二行包含 mm 个质数。

输出格式

输出一个整数,表示满足条件的整数的个数。

数据范围

1≤m≤161≤m≤16,
1≤n,pi≤1091≤n,pi≤109

输入样例:

10 2 2 3

输出样例:

7


  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. const int N = 20;
  7. int p[N];
  8. int n,m;
  9. int main() {
  10. cin >> n >> m;
  11. for (int i = 0; i < m; ++i) cin >> p[i];
  12. int res = 0;
  13. for (int i = 1; i < 1 << m; ++i) { //有m个数,有2^m - 1个选法(除了全不选)
  14. int t = 1, cnt = 0; //t表示质数乘积,cnt表示有多少个集合
  15. for (int j = 0; j < m; ++j) {
  16. if (i >> j & 1) { //说明选了这个集合
  17. cnt++;
  18. if ((LL)t * p[j] > n) {
  19. t = -1;
  20. break;
  21. }
  22. t *= p[j];
  23. }
  24. }
  25. if (t != -1) {
  26. //奇数个集合就加上 n / t 表示有多少个n 整除t 的个数
  27. if (cnt % 2) res += n / t;
  28. else res -= n / t;
  29. }
  30. }
  31. cout << res << endl;
  32. return 0;
  33. }