题意
给出n个数和一个m,求m内有多少个数是这n个数里任意数的倍数。
思路
枚举一下所有的这n个数的lcm,然后经典容斥,注意是lcm不是相乘。
代码
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define LL long long
#define Lowbit(x) ((x)&(-x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1|1
#define MP(a, b) make_pair(a, b)
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
const int maxn = 1e5 + 10;
const double eps = 1e-8;
const double PI = acos(-1.0);
typedef pair<int, int> pii;
int n;
LL m, ans;
LL a[11];
LL lcm(LL a, LL b)
{
return a / __gcd(a, b) * b;
}
void dfs(int cur, int cnt, LL now)
{
if (now > m) return ;
if (cur > n)
{
if (!cnt) return ;
if (cnt & 1) ans += m / now;
else ans -= m / now;
return ;
}
dfs(cur + 1, cnt + 1, lcm(now, a[cur]));
dfs(cur + 1, cnt, now);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while (cin >> n >> m)
{
for (int i = 1; i <= n; i++)
cin >> a[i];
ans = 0;
dfs(1, 0, 1);
cout << ans << endl;
}
return 0;
}