分析:
此题是典型的容斥原理题,一开始理解错误,写成了丑数题,反正一直超时,后来才发现;
要求不是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的倍数的个数。
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 __int64 n; 6 while(scanf("%I64d",&n)!=EOF) 7 { 8 __int64 a=n/2; 9 __int64 b=n/3; 10 __int64 c=n/5; 11 __int64 d=n/7; 12 __int64 ab=n/6; 13 __int64 ac=n/10; 14 __int64 ad=n/14; 15 __int64 bc=n/15; 16 __int64 bd=n/21; 17 __int64 cd=n/35; 18 __int64 abc=n/30; 19 __int64 abd=n/42; 20 __int64 acd=n/70; 21 __int64 bcd=n/105; 22 __int64 abcd=n/210; 23 __int64 ans=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd; 24 printf("%I64d\n",n-ans); 25 } 26 return 0; 27 }