2 3 5 7的倍数

基准时间限制:1 秒 空间限制:131072 KB
给出一个数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

离散中包含排斥原理
 1 #include <stdio.h>
 2 #define ll long long
 3 /*
 4 只需要分别知道2的倍数个数,3的倍数个数,5的倍数个数,7的倍数的个数,
 5 之后通过容斥原理
 6 (先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,
 7 然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,
 8 这种计数的方法称为容斥原理
 9 */
10 int main(){
11     ll n;
12     scanf("%lld",&n);
13     ll a, b, c, d, ab, ac, ad, bc, bd, cd, abc, abd, acd, bcd, abcd;
14     a = n / 2;
15     b = n / 3;
16     c = n / 5;
17     d = n / 7;
18     ab = n / 6;
19     ac = n / 10;
20     ad = n / 14;
21     bc = n / 15;
22     bd = n / 21;
23     cd = n / 35;
24     abc = n / 30;
25     abd = n / 42;
26     acd = n / 70;
27     bcd = n / 105;
28     abcd = n / 210;
29     ll num = a + b + c + d - ab - ac - ad - bc - bd - cd + abc + abd + bcd + acd - abcd;
30     printf("%lld",n - num);
31 }
 
原文地址:https://www.cnblogs.com/jxust-jiege666/p/6665210.html