CF 148A Insomnia cure

时间:2022-07-30 20:00:02

题目链接:传送门

题目大意:就是给四个数,和一个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=;
for(int i=;i<=d;i++)
if(i%k== || i%l== || i%n== || i%m==)
ans++;
printf("%d\n",ans);
}

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

#include<stdio.h>
int gcd(int x,int y){
if(x==)
return y;
gcd(y%x,x);
}
int lcm(int x,int y){
return y*x/gcd(x,y);
}
int main(){
int a[],d;
int ans=;
scanf("%d%d%d%d%d",&a[],&a[],&a[],&a[],&d);
for(int i=;i<;i++){
ans+=d/a[i];
for(int j=i+;j<;j++){
ans-=d/lcm(a[i],a[j]);
for(int q=j+;q<;q++){
ans+=d/lcm(lcm(a[i],a[j]),a[q]);
for(int p=q+;p<;p++)
ans-=d/lcm(lcm(lcm(a[i],a[j]),a[q]),a[p]);
}
}
}
printf("%d\n",ans);
}