CF 148A Insomnia cure

题目链接:传送门

题目大意:就是给四个数,和一个d,问1-d中有多少个数字不是那四个数的倍数;

这道题的d数据很小直接暴力可以过;

暴力代码:时间复杂度O(1);

#include<stdio.h>
int main(){
    int k,m,n,d,l;
    scanf("%d%d%d%d%d",&k,&l,&m,&n,&d);
    int ans=0;
    for(int i=1;i<=d;i++)
        if(i%k==0 || i%l==0 || i%n==0 || i%m==0)
            ans++;
    printf("%d
",ans);
}
View Code

还可以根据容斥定理做,不过时间复杂度要大一点,不过毕竟只有4个数,这种方法也适用于d比较大的情况。所以学一学并没有坏处

#include<stdio.h>
int gcd(int x,int y){
    if(x==0)
        return y;
    gcd(y%x,x);
}
int lcm(int x,int y){
    return y*x/gcd(x,y);
}
int main(){
    int a[4],d;
    int ans=0;
    scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&d);
    for(int i=0;i<4;i++){
        ans+=d/a[i];
        for(int j=i+1;j<4;j++){
            ans-=d/lcm(a[i],a[j]);
            for(int q=j+1;q<4;q++){
                ans+=d/lcm(lcm(a[i],a[j]),a[q]);
                for(int p=q+1;p<4;p++)
                    ans-=d/lcm(lcm(lcm(a[i],a[j]),a[q]),a[p]);
            }
        }
    }
    printf("%d
",ans);
}
View Code
原文地址:https://www.cnblogs.com/OMG-By/p/5752303.html