容斥原理

题目描述

给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。

输入描述:

本题有多组输入
每行一个数n,1<=n<=100000.

输出描述:

每行输出输出不是2 5 11 13的倍数的数共有多少。
  
示例1

输入

15

输出

4

说明

1 3 7 9
这道题用了数学上的容斥原理;先来解释一下
容斥原理:这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。
拿这题为例子,我们先分别算出是2,5,11,13倍数的集合总数x1;(所有满足条件的都加一起,一个满足条件的数字可能被多次计数)
然后我们算出2*5,2*11,2*13,5*11,5*13,11*13倍数的集合总数x2;(两个因子相乘的最小公倍数,我们要将它剔除)
以及2*5*11,2*5*13,5*11*13,x3;
2*5*11*13,x4;
然后总数就是x1-x2-x3-x4;
代码如下:
#include <iostream>  
    using namespace std;  
    int main()  
  {
    long long n,num,a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,bcd,acd,abcd;  
    cin>>n;   
    num=0;  
  
    a=n/2;  
    b=n/5;  
    c=n/11;  
    d=n/13;  
      
    ab=n/10;  
    ac=n/22;  
    ad=n/26;  
    bc=n/55;  
    bd=n/65;  
    cd=n/143;  
  
    abc=n/110;  
    abd=n/130;  
    acd=n/286;  
    bcd=n/715;  
  
    abcd=n/1430;  
  
    num=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;  
      
    cout<<n-num ; 
    return 0;  
} 
转载再创作hhh,我原来是用死方法一个个排除的,用这个方法一下子逼格起来了;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值