不是2 5 11 13的倍数,容斥原理

链接: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;
 } 

猜你喜欢

转载自blog.csdn.net/qq_41705596/article/details/83934262