大水题

大水题

https://ac.nowcoder.com/acm/problem/15079

题解:
容斥原理
要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回有三个集合相交的部分,再减去所有四个集合相交的部分....依此类推,一直计算到所有集合相交的部分。
拿这个题举个栗子。
你先计算出单个数被整除的次数加起来,你会发现比如说10这个数字,会被2 和5同时整除,所以你要再减去10的倍数。再看110这个数字,会同时被2 5 11整除,这样的话会被记录三次,因为我们减去了两两之间最小的公倍数,所以是减去了3,这样的话会导致110这个数字没有被记录上,所以我们同时再加上三三之间的倍数。。。。。以此类推。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn=1e5+10;
using namespace std;
const double pi=3.14;

int main()
{
    ll ans=0;
    ll n;
    ll a[]={2,5,11,13};
    ll b[]={10,22,26,55,65,143};
    ll c[]={110,130,286,715};
    while(cin>>n){
        ans=0;
        for(int i=0;i<4;i++){
            ans+=n/a[i];
        }
        for(int i=0;i<6;i++){
            ans-=n/b[i];
        }
        for(int i=0;i<4;i++){
            ans+=n/c[i];
        }
        ans-=n/1430;
        cout<<n-ans<<endl;
    }
    return 0;
}
题解 文章被收录于专栏

主要写一些题目的题解

全部评论

相关推荐

11-13 20:16
已编辑
厦门理工学院 软件测试
专业嗎喽:硕佬,把学校背景放后面几段,学校背景双非还学院,让人看了就不想往下看。 把实习经历和个人奖项放前面,用数字化简述自己实习的成果和掌握的技能,比如负责项目一次通过率90%,曾4次发现项目潜在问题风险为公司减少损失等等
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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