先看题目:https://ac.nowcoder.com/acm/problem/15079
解题思路:
题目要求的是不是2,5,11,13的倍数,我们可以考虑是2,5,11,13的倍数有多少个,即求|2的倍数 U 5的倍数 U 11的倍数 U 13的倍数|,如果把它们直接加起来,发现会有一些元素重复统计了。(比如计算有n中有多少个2的倍数中会包含5,11,13的倍数),因此需要使用容斥原理。
容斥原理的内容是:对于任意个集合,都可列出这样一个等式,其中左边是所有集合的并的个数,右边是这些集合的“各种搭配”。每个“搭配”都是若干集合的交集,且每一项前面的正负号取决于集合的个数————奇数个集合为正,偶数个集合为负。
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    // 2 5 11 13
    ll n;
    while(cin >> n) {
        ll sum1 = n/2 + n/5 + n/11 + n/13;
        ll sum2 = n/10 + n/22 + n/26 + n/55 + n/65 + n/143;
        ll sum3 = n/110 + n/130 + n/286 + n/715;
        ll sum4 = n/1430;
        cout << n - (sum1-sum2+sum3-sum4) << endl;
    }
}