给出一个数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的倍数的数共有多少。
Sample Input
10
Sample Output
1
分析:看到这个题第一反应就应该是容斥原理,因为数据范围很大,预处理会超内存,直接遍历会超时,那么就需要技巧了,就是集合运算的应用---容斥原理。
下面看一下公式:
所以直接套公式就可以了,上代码吧:
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) {
long n = in.nextLong();
long a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,bcd,acd,abcd;
long ans = 0;
a=n/2;b=n/3;c=n/5;d=n/7;
ab=n/6;ac=n/10;ad=n/14;bc=n/15;bd=n/21;cd=n/35;
abc=n/30;abd=n/42;bcd=n/105;acd=n/70;abcd=n/210;
ans = a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;
System.out.println(n - ans);
}
}