再数17(搜索+容斥)
n个集合的容斥其实就是 总的 减去两两相交的 加上三个相交 减去四个相交 加上五个.....(奇加偶减)
这道题就是一个lcm的容斥
我们用搜索来实现 枚举选的数
需要加个剪枝 当前lcm已经超过了m
#include<bits/stdc++.h>
#define N 35
#define int long long
using namespace std;
int n,m,a[N],ans;
inline int gcd(int x,int y)
{
if(y==0) return x;
return gcd(y,x%y);
}
inline int lcm(int x,int y)
{
return x/gcd(x,y)*y;
}
void dfs(int now,int sum,int num)
{
if(sum>m) return;
if(now==n+1)
return;
int x=lcm(sum,a[now]);
if(num&1)
ans+=m/x;
else
ans-=m/x;
dfs(now+1,x,num+1); //选
dfs(now+1,sum,num); //不选
}
inline bool cmp(const int &a,const int &b){
return a>b;
}
main()
{
cin>>n>>m;
if(m>17) m-=17;
for(int i=1;i<=n;i++) cin>>a[i];
dfs(1,1,1);
cout<<++ans;
return 0;
}
QQ40523591~欢迎一起学习交流~