题意:
问1到m之间有多少个数能被序列的任意一个数整除
思路:
容斥,序列最多只有10个,用二进制优化一下,跑一遍容斥
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <cmath>
#include <vector>
#include <bitset>
#define max_ 1100000
#define inf 0x3f3f3f3f
#define ll long long
#define les 1e-8
#define mod 10000007
using namespace std;
int n;
ll m;
int num[20];
int main()
{
while(scanf("%d%lld",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
ll ans=0;
for(ll i=1;i<(1LL<<n);i++)
{
ll sum=1;
int k=0;
for(int j=0;j<=n-1;j++)
{
if((1<<j)&i)
{
sum=sum/__gcd(sum,(ll)num[j+1])*num[j+1];
k++;
}
}
if(k&1)
ans+=m/(sum);
else
ans-=m/(sum);
}
printf("%lld\n",ans);
}
}