How many integers can you find
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
给你三个数,n,m1,m2,找出所有小于n的能被m1或m2整除的数的个数。
-
输入
-
输入包含多组测试数据,每组数据占一行。
0<n<2^31,0<m1,m2<=10。
输出
- 每组数据输出占一行。 样例输入
-
12 2 3
样例输出
-
7
来源
- 爱生活 上传者
思路:开始我想的是在n内找一下能被m1整除的数,能被m2整除的数,然后去重。但是不知道怎么,runtime error。
然后看了一下讨论组里的恍然大悟,离散里面讲过! 比如说1~100内能被2整除的数就是100除以2=50个数,能被3整除的有100除以3,向下取整,33个数,能被2和3同时整除是100除以(2和3的最小公倍数)向下取整。然后至少能被其中一个整除的个数就用包含排斥原理即可。
runtime error暂时还没想好怎么改
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int a[1000000]; int main() { int n,m1,m2,k,i,count; while(scanf("%d%d%d",&n,&m1,&m2)!=EOF) { k=0; count=0; for(i=1;i*m1<n;i++) a[k++]=i*m1; for(i=1;i*m2<n;i++) a[k++]=i*m2; sort(a,a+k); for(i=0;i<k;i++)//aaabbccd { while(i<k-1 &&a[i]==a[i+1]) { i++; } count++; } cout<<count<<endl; } return 0; }
my ac code:
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int gcd(int a,int b) { if(b==0) return a; return gcd(b,a%b); } int main() { int n,m1,m2,i,count,A1,A2,A; while(scanf("%d%d%d",&n,&m1,&m2)!=EOF) { A=(m1*m2)/gcd(m1,m2); A=(n-1)/A; A1=(n-1)/m1; A2=(n-1)/m2; cout<<A1+A2-A<<endl; } return 0; }
-
输入包含多组测试数据,每组数据占一行。