用容斥原理求出不满足条件的个数cnt,然后用n-cnt就得到答案了。
这里不满条件的数就是能整除2,3,5,7这些数的集合并集。要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分。
文章推荐:http://www.cppblog.com/vici/archive/2011/09/05/155103.html
#include <iostream> #include<bits/stdc++.h> using namespace std; int main() { long long n,ans; scanf("%lld",&n); ans=n; ans-=(n/2+n/3+n/5+n/7); ans+=(n/6+n/10+n/14+n/15+n/21+n/35); ans-=(n/30+n/42+n/70+n/105); ans+=(n/210); cout<<ans<<endl; }