2018年全国多校算法寒假训练营练习比赛(第三场)G-大水题(容斥原理)

链接:https://www.nowcoder.com/acm/contest/75/G
来源:牛客网


时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述 
给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。 
输入描述:
本题有多组输入
每行一个数n,1<=n<=10^18.
输出描述:
每行输出输出不是2 5 11 13的倍数的数共有多少。
示例1
输入
15
输出
4
说明

1 3 7 9

题意:求不是2、5、11、13倍数的数的个数

思路:显然,这四个数互质,也就是说他们的倍数是不相交的。运用容斥原理:奇数个集合相交的部分加上,偶数个集合相交的部分减去。

代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define IO ios::sync_with_stdio(false);cin.tie(0);
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
int main()
{
	ll n;
	while(cin >> n){
		ll a=n/2,b=n/5,c=n/11,d=n/13;
		ll ab=n/10,ac=n/22,ad=n/26,bc=n/55,bd=n/65,cd=n/143;
		ll abc=n/110,abd=n/130,acd=n/286,bcd=n/715;
		ll abcd=n/1430;
		ll ans = a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;
		cout << n-ans << endl;
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值