2020年牛客算法入门课练习赛3 B
题意:给你一个区间[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;
}
 
                     
                    
                 
                    
                 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号