题目链接:传送门
题目大意:就是给四个数,和一个d,问1-d中有多少个数字不是那四个数的倍数;
这道题的d数据很小直接暴力可以过;
暴力代码:时间复杂度O(1);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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\n",ans); }
还可以根据容斥定理做,不过时间复杂度要大一点,不过毕竟只有4个数,这种方法也适用于d比较大的情况。所以学一学并没有坏处
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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\n",ans); }