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