一、题目:
Description
Dream、Griselda 还有 Sunshine正打算装饰一下集训队的墙,为了省钱,她们决定只买三原色的染料,这样就可以花费很少的钱,得到所有的颜色了O(∩_∩)O~
最初她们把墙分成了n块,编号分别为1,2,3,……n。
Dream、Griselda、sunshine分别喜欢数字x,y,z,她们只涂编号为她们喜欢的数字的倍数的墙,例如: Griselda 喜欢数字3,所以Griselda只涂编号是3,6,9,12……那些墙;
涂完之后,问这n块墙中有多少是由三原色共同调出来的?
Input
本题有多组测试数据,每组测试数据输入四个正整数x,y,z,n其中满足
(0<x,y,z<=1000;0<n<=10^9)。
Output
对于每组测试数据输出一个数字,即三原色共同调出的墙块总数。
Sample Input
1 2 3 4
6 2 4 1000
Sample Output
0
83
Hint
不要使用%I64,使用%lld
二、解题思路:
求最小公倍数即可
三、代码:
/// #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; typedef long long ll; ll GCD (ll a , ll b) ///最大公约数 { ll c ; while(b != 0) { c = a % b; a = b; b = c; } return a; } ll LCM(ll a , ll b) ///最小公倍数 { return a*b/GCD(a,b); } int main() { long long x,y,z,n; while(scanf("%lld%lld%lld%lld",&x,&y,&z,&n) != EOF) { ll lcm1 = LCM(x , y); ll lcm2 = LCM(lcm1 , z); printf("%lld\n",n/lcm2); /* long long i; 暴力超时 long long count = 0; for(i = 1; i <= n; i++) { if( (i % x == 0) && (i % y == 0) && (i % z == 0)) count ++ ; } printf("%lld\n",count); */ } // ll a,b; // scanf("%lld%lld",&a,&b); // ll gcd = GCD(a,b); // ll lcm = LCM(a,b); // printf("%lld %lld",gcd,lcm); return 0; }