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

本文介绍如何使用容斥原理解决一个数学问题:计算1到N范围内不是2、3、5、7这四个质数倍数的数的数量。通过巧妙运用集合运算,该文提供了一种高效算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值