大水题

先看题目:https://ac.nowcoder.com/acm/problem/15079
解题思路:
题目要求的是不是2,5,11,13的倍数,我们可以考虑是2,5,11,13的倍数有多少个,即求|2的倍数 U 5的倍数 U 11的倍数 U 13的倍数|,如果把它们直接加起来,发现会有一些元素重复统计了。(比如计算有n中有多少个2的倍数中会包含5,11,13的倍数),因此需要使用容斥原理。
容斥原理的内容是:对于任意个集合,都可列出这样一个等式,其中左边是所有集合的并的个数,右边是这些集合的“各种搭配”。每个“搭配”都是若干集合的交集,且每一项前面的正负号取决于集合的个数————奇数个集合为正,偶数个集合为负。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    // 2 5 11 13
    ll n;
    while(cin >> n) {
        ll sum1 = n/2 + n/5 + n/11 + n/13;
        ll sum2 = n/10 + n/22 + n/26 + n/55 + n/65 + n/143;
        ll sum3 = n/110 + n/130 + n/286 + n/715;
        ll sum4 = n/1430;
        cout << n - (sum1-sum2+sum3-sum4) << endl;
    }
}
全部评论

相关推荐

安静的鲸鱼offer...:神仙级别hr,可遇不可求,甚至他可能也是突然有感而发。只能说遇上是件幸事。
秋招开始捡漏了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务