【ZZULIOJ 1302】海军节上的鸣炮声计算 【容斥】

海军节上的鸣炮声计算
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值