vijosP1629 八
【思路】
暴力容斥(看他们都这么叫=_=)+精度选择。
总体思路是先统计LR区间内满足是8倍数的数目ans,再从ans中减去区间里8和一个a 的lcm的倍数的数目,再加上8和2个a的lcm的倍数,再减去……
因为n最大为15因此只要枚举二进制数即可表示a的所有组合。
计算LR区间内x倍数:R/x-(L-1)/x
精度用long long。
【代码】
#include<iostream>
using namespace std; typedef long long LL;
LL n,L,R,A[]; inline LL gcd(LL a,LL b) {
if(!b) return a;
return gcd(b,a%b);
}
inline LL lcm(LL a,LL b) {
return a*b/gcd(a,b);
} int main() {
cin>>n;
for(int i=;i<n;i++) cin>>A[i];
cin>>L>>R;
LL ans=R/-(L-)/;
for(int s=;s<=(<<n)-;s++)
{
LL _lcm=,cnt=;
for(int i=;i<n;i++) if(s&(<<i)) _lcm=lcm(_lcm,A[i]) , cnt++;
if(cnt&) ans -= R/_lcm-(L-)/_lcm;
else ans += R/_lcm-(L-)/_lcm;;
}
cout<<ans;
return ;
}