2 3 5 7 的倍数 (容斥原理)

老子叫甜甜 提交于 2019-11-26 04:54:28

Description:

给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。

Input

输入1个数N(1 <= N <= 10^18)。

Output

输出不是2 3 5 7的倍数的数共有多少。

Input示例

10

Output示例

1
容斥原理:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再计数是重复的数目排除出去,使将计算的结果既无遗漏又无重复。
假如有两个集合:A于B,则AUB = A+B-AB
三个集合:A与B与C,AUBUC = A + B + C - AB - AC - BC + ABC
四个集合,可以想象成3维的,AUBUCUD = A+B+C+D -AB-AC-AD-BC-BD-CD + ABC+ABD+BCD+ABD -ABCD;

AC代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<iomanip>
#include<math.h>
const int INF = 0x3f3f3f3f;
using namespace std;
typedef long long ll;
typedef double ld;
const int N = 100010;
int main(){
    ll n;
    scanf("%lld",&n);
    ll sum=0;
    sum+=n/2;
    sum+=n/3;
    sum+=n/5;
    sum+=n/7;

    sum-=n/6;
    sum-=n/10;
    sum-=n/14;
    sum-=n/15;
    sum-=n/21;
    sum-=n/35;

    sum+=n/105;
    sum+=n/70;
    sum+=n/42;
    sum+=n/30;

    sum-=n/210;
    printf("%lld\n",n-sum);
return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!