链接:https://ac.nowcoder.com/acm/contest/75/G
来源:牛客网
题目描述
给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。
输入描述:
本题有多组输入 每行一个数n,1<=n<=10^18.
输出描述:
每行输出输出不是2 5 11 13的倍数的数共有多少。
示例1
输入
15
输出
4
说明
1 3 7 9
思路
按照正常的思路,这道题可以一遍一遍的遍历得到,但是这样时间不符合题目的要求,所以这里要用到容斥原理。
容斥原理:计算几个集合并集的大小,我们要先将单个集合的大小计算出来,然后减去两个集合相交的部分,再加回三个集合相交的部分,再减去四个集合相交的部分。
此题:A∪B∪C∪D = A+B+C+D - AB -AC-AD-BC-BD-CD+ABC+ABD+ACD-ABCD(省略∩)
代码
#include<stdio.h>
#include<iostream>
using namespace std;
#define l long long
int main()
{
l n,sum;
while(~scanf("%ld",&n))
{
sum=n/2+n/5+n/11+n/13-n/10-n/22-n/26-n/55-n/65-n/143+n/110+n/130+n/286+n/715-n/1430;
cout<<n-sum<<endl;
}
return 0;
}