vijosP1629 八

时间:2024-06-08 15:06:44

vijosP1629 八

链接:https://vijos.org/p/1629

【思路】

暴力容斥(看他们都这么叫=_=)+精度选择。

总体思路是先统计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 ;
}