2020年牛客算法入门课练习赛3 B

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;
}

posted @ 2020-06-30 17:25  John_Ran  阅读(115)  评论(0编辑  收藏  举报