再数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;
}
posted @ 2018-11-01 12:16  Patrickpwq  阅读(145)  评论(0编辑  收藏  举报