30
```
int main() {
long long n;
while (scanf("%lld", &n) != EOF) {
//2、5、11、13中>=一个数的倍数的数的个数
long long count = 0;
// 单个集合的和
count += n / 2 + n / 5 + n / 11 + n / 13;
// 减去两个集合交集
count -= n / 10 + n / 22 + n / 26 + n / 55 + n / 65 + n / 143;
// 加上三个集合交集
count += n / 110 + n / 130 + n / 286 + n / 715;
// 减去四个集合交集
count -= n / 1430;
// 不是2、5、11、13倍数的数的个数 = 总数n - 是至少一个倍数的数的个数count
printf("%lld\n", n - count);
◮:容斥计算:首先是2、5、11、13单个倍数的数的个数之和。然后减去是其中两个数公倍数的数的个数之和(因为重复计算了)。再加上是其中三个数公倍数的数的个数之和(因为前面减多了)。最后减去是四个数公倍数的数的个数(因为前面加多了
◮:
浙公网安备 33010602011771号