2 3 5 7的倍数 --容斥原理


给出一个数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

分析:看到这个题第一反应就应该是容斥原理,因为数据范围很大,预处理会超内存,直接遍历会超时,那么就需要技巧了,就是集合运算的应用---容斥原理。

下面看一下公式:

2 3 5 7的倍数 --容斥原理_第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);      	 
      }
 }  
 


你可能感兴趣的:(vjudge练习,组合数学)