51nod 1284 2 3 5 7的倍数

2 3 5 7的倍数

此题是典型的容斥原理题,一开始理解错误,写成了丑数题,后来才发现;

要求不是2,3,5,7的倍数的个数,可以先求出2,3,5,7的个数,之后通过n减去2,3,5,7的倍数的个数可求得不是2,3,5,7的倍数的个数;

而要知道2,3,5,7的倍数的个数,只需要分别知道2的倍数个数,3的倍数个数,5的倍数个数,7的倍数的个数,之后通过容斥原理(先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理–简而言之,就是对于重叠次数只有奇数次的,我们加上,重叠次数为偶数次的,我们要减去)可得到。最后即可得到不是2 3 5 7的倍数的个数。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include <cmath>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;

ll n;

int main(){
    ll a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd;
    scanf("%lld",&n);
        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,acd=n/70,abd=n/42,bcd=n/105;
        abcd=n/210;
    printf("%lld\n",n-(a+b+c+d-ab-ac-ad-bc-bd-cd+bcd+abc+abd+acd-abcd));
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值