给出一个数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
import java.util.Scanner;
public class Domo
{
/*
* 在计数时,必须注意没有重复,没有遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,
* 把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。
*/
public static void main(String args[])
{
long n;
Scanner input = new Scanner(System.in);
n = input.nextLong();
/*
* (n /2 + n / 3 + n / 5 + n / 7) 表示是2 3 5 7 的倍数的数个数,里面包含重复计算,根据容斥定理易知
* (n / 10 + n / 6 + n / 14 + n / 15 + n / 21 + n / 35) 表示任意两个结合的所有可能情况,里面包含3个集合相交和4个集合相交
* (n / 42 + n / 105 + n / 30 + n / 70) 表示三个集合相交的情况,包含四个集合相交的情况
* n / 210 表示四个集合相交
*/
/*
* 要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,
* 再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。
*/
long m = n - ((n /2 + n / 3 + n / 5 + n / 7) - (n / 10 + n / 6 + n / 14 + n / 15 + n / 21 + n / 35) + (n / 42 + n / 105 + n / 30 + n / 70) - n / 210);
System.out.println(m);
}
}