主要是通过容斥原理将悲剧数字和幸运数字的最小公倍数相加减,来进行搜索。为避免重复搜索,我用了状压来优化。
但不知道为啥有4个点和正确答案差一,不知道那里错了,求大佬调代码...
code:
#include<bits/stdc++.h>
using namespace std;
#define RI register int
#define ll unsigned long long
#define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
ll ln,n;
ll l,r;
ll a[25];
ll ans=0,fh;
ll ttt,tt,lcmm,ss;
bool x[1<<15];
ll gcd(ll x,ll y){
return y==0?x:gcd(y,x%y);
}
ll lcm(int c){
ss=ln;
for(RI i=0;i<n;i++)
if((c>>i)&1)
ss=ss/gcd(ss,a[i])*a[i];
return ss;
}
void dfs(int t,int c){
if(t>n||x[c])
return;
x[c]=true;
fh=1,lcmm=lcm(c);
if(t&1)
fh=-fh;
ttt=r/lcmm,tt=l/lcmm,ttt-=tt;
ans=ans+fh*ttt;
for(RI i=0;i<n;i++)
if(!((c>>i)&1))
dfs(t+1,c|(1<<i));
return;
}
int main(){
// file(lucky);
scanf("%lld%lld%lld%lld",&ln,&n,&l,&r);
for(RI i=0;i<n;i++)
scanf("%lld",&a[i]);
dfs(0,0);
printf("%lld",ans);
return 0;
}