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示例
10Output示例
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;
}
来源:https://blog.csdn.net/qq_43627087/article/details/98756908