此题是典型的容斥原理题,一开始理解错误,写成了丑数题,后来才发现;
要求不是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;
}