海军节上的鸣炮声计算 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; }