海军节上的鸣炮声计算
Description
在海军节开幕式上,有A、B、C三艘军舰要同时开始鸣放礼炮各n响。已知A舰每个a秒放一次,B舰每隔b秒放一次,C舰每隔c秒放一次。假设各炮手对时间的掌握非常准确,请编程计算观众总共可以听到几次炮声。
Input
输入n,a,b,c的值,所有输入不大于10000。
Output
输出一个整数,代表观众听到的礼炮声总数。
Sample Input
21 7 6 5
Sample Output
54
HINT
Source
题目描述坑爹,一直以为从零时刻开始计时,每隔多久响一次。wa半天,其实是零时刻,都响一次,然后才是每隔多久来一次响声。
别的题解有更简单的,因为题目的范围较小,所以用数组模拟就可以了。
我用的是小容斥
代码
三个分别响的次数-任意两个同时响的次数+三个同时响的次数 。
标准的容斥思想。
include<bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN =100;
const int MAXM = 200000;
LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b) ;}
LL lcm(LL a,LL b){ return a/gcd(a,b)*b ;}
int main(){
LL n,a,c,b;
while(scanf("%lld%lld%lld%lld",&n,&a,&b,&c)!=EOF){
n--;//因为题意是 一开始先同时响一次
LL sum=3*n+1;
// printf("%lld\n",sum);
LL d=lcm(a,b);
sum-=min(n*a,n*b)/lcm(a,b);
//printf("%lld\n",sum);
d=lcm(a,c);
sum-=min(n*a,n*c)/d;
// printf("%lld\n",sum);
d=lcm(b,c);
sum-=min(n*b,n*c)/d;
// printf("%lld\n",sum);
sum+=min(n*c,min(n*a,n*b))/lcm(c,lcm(a,b));
printf("%lld\n",sum);
}
return 0;
}