先看题目: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; } }