解题思路:易知给定一个n, m。求1-m中有多少个数能被n整除,可以用
⌊
m
/
n
⌋
\lfloor m/n \rfloor
⌊m/n⌋直接算出来。所以本题我们只需要枚举(这里用二进制的方法枚举)一下从集合里面选那些数去整除m即可,不过这里面可能有交集,所以我们可以用容斥原理来做到不重不漏,当集合所选数的个数为奇数是我们加上m/n (n表示所选数的乘积),反之则减去
C++代码
#include <bits/stdc++.h>
// #define int long long
using namespace std;
const int N = 25;
int a[N], n, m;
signed main()
{
cin >> n >> m;
for (int i = 0; i < n; i ++ )
{
cin >> a[i];
}
int res = 0;
for (int i = 1; i < (1 << n); i ++ ) //至少被一个数整除,从1开始
{
int tmp = m, cnt = 0;
for (int j = 0; j < n; j ++ )
{
if (i >> j & 1)
{
tmp /= a[j];
cnt ++ ;
}
}
if (cnt & 1) res += tmp;
else res -= tmp;
}
cout << res << endl;
return 0;
}