题意:给你一个区间[L,R]和长度为n一个数组((n<=15)),考虑这个区间里有多少个数能被8整除,并且无法被这个数组中任何一个数字整除。
分析:由于要考虑不能被一个数组中的任何一个元素进行整除,并且数组中的数字比较大。个人感觉写数位dp是没有前途的。由于数组比较小,所以考虑容斥,在求LCM的时候,一个一个求就好。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 20;
LL a[N], l, r, n, ans;
int solve(int x){
int ans=x/8;
for(int id=1;id<(1<<n);++id){
LL num=8;
int cnt=0;
for(int i=0;i<n;++i){
if(id>>i&1){
++cnt;
num=num*a[i]/__gcd(num,a[i]);
}
if(num>x)break;
}
if(num>x)continue;
if(cnt&1){
ans-=x/num;
}else{
ans+=x/num;
}
}
return ans;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;++i)scanf("%d",a+i);
scanf("%d%d",&l,&r);
printf("%d",solve(r)-solve(l-1));
return 0;
}