勤奋的涟漪
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
涟漪每天都会到工一的实验室(7楼)学习,一天去三次。工一有两部电梯,其中有一部电梯每隔x天维修一次,(维修期间,电梯一整天都不工作),另一部电梯每隔y天维修一次,如果同一天两部楼梯都在维修期间,涟漪只能爬楼梯,他想知道从第1天到第n天一共走了多少层楼梯?(设第0天两部电梯都在维修)
-
输入
- 第一行包含t组测试数据(t<=150) 每组测试输入3个数字x,y,n(0<=x<=1000 , 0<=y<=1000 , n<=1e9) 输出
- 输出走了多少层楼梯。 样例输入
-
2 1 1 2 2 3 6
样例输出
-
36 0
-
题目不难,却比较坑(额,或者说比较灵活吧)。
-
思路:只需求x,y的最小公倍数m,再用天数n除m,就得到了n天里要爬楼梯的天数,
-
再乘每天爬的楼层数即大功告成。(然而一不注意就是WrongAnser~~~)
-
值得注意的是:
-
1)“ 每隔x天维修一次”,意味着要在x,y的基础上都加1;
-
2)一共走了多少层楼梯;走,可以是上楼梯也可以是下楼梯嘛!
-
3)注意数据范围,n<=1e9,1e9=10^9,总之int存是不行的,不信?
-
来给组数据试试便知
-
测试数据
-
1
0 0 1000000000
-
答案
-
36000000000 > INT_MAX(int的最大值2147483648)
-
AC代码
-
#include <stdio.h> long gcd(long long a, long long b) { if(a == 0) return b; return gcd(b%a, a); } int main() { long long x, y, n, t; scanf("%lld", &t); while(t--) { scanf("%lld%lld%lld", &x, &y, &n); x++; y++; printf("%lld\n",(n/(x*y/gcd(x,y))*36)); } return 0; }