题解:
容斥原理
要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回有三个集合相交的部分,再减去所有四个集合相交的部分....依此类推,一直计算到所有集合相交的部分。
拿这个题举个栗子。
你先计算出单个数被整除的次数加起来,你会发现比如说10这个数字,会被2 和5同时整除,所以你要再减去10的倍数。再看110这个数字,会同时被2 5 11整除,这样的话会被记录三次,因为我们减去了两两之间最小的公倍数,所以是减去了3,这样的话会导致110这个数字没有被记录上,所以我们同时再加上三三之间的倍数。。。。。以此类推。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn=1e5+10;
using namespace std;
const double pi=3.14;

int main()
{
    ll ans=0;
    ll n;
    ll a[]={2,5,11,13};
    ll b[]={10,22,26,55,65,143};
    ll c[]={110,130,286,715};
    while(cin>>n){
        ans=0;
        for(int i=0;i<4;i++){
            ans+=n/a[i];
        }
        for(int i=0;i<6;i++){
            ans-=n/b[i];
        }
        for(int i=0;i<4;i++){
            ans+=n/c[i];
        }
        ans-=n/1430;
        cout<<n-ans<<endl;
    }
    return 0;
}