让你找 1 ~ (n - 1)内,能够被 一个数组m中 任意的数 整除的数有多少
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 12;
ll p[N];
ll gcd(ll a, ll b) //最大公约数
{
if(b == 0) return a;
return gcd(b, a % b);
}
ll lcm(ll a, ll b) //最小公倍数
{
return a * b / gcd(a, b);
}
ll solve(ll n, ll m)
{
ll ans = 0;
for(ll i = 1; i < (1 << m); i ++) // 相当于枚举所有的情况 时间复杂度o(2^n*n)?
{
ll cnt = 0, tmp = 1;
for(ll j = 0; j < m; j ++) //每个状态下的情况
{
if(i & (1 << j))
{
cnt ++;
tmp = lcm(tmp, p[j]);
}
}
if(cnt & 1) ans += n / tmp;
else ans -= n / tmp;
}
return ans;
}
int main()
{
ll n, m;
while(cin >> n >> m)
{
ll t = 0, x;
for(ll i = 0; i < m; i ++)
{
cin >> x;
if(x > 0) p[t ++] = x;
}
m = t;
cout << solve(n - 1, m) << endl;
}
return 0;
}