容斥原理题目

1.AcWing 890. 能被整除的数

题目链接
给定一个整数 n 和 m 个不同的质数 p1,p2,…,pm。

请你求出 1∼n 中能被 p1,p2,…,pm 中的至少一个数整除的整数有多少个。

输入格式
第一行包含整数 n 和 m。

第二行包含 m 个质数。

输出格式
输出一个整数,表示满足条件的整数的个数。

数据范围
1≤m≤16,
1≤n,pi≤109
输入样例:
10 2
2 3
输出样例:
7
分析:运用容氏原理,加上能被1个质数整除的个数,减去能同时被两个质数整除的个数,加上能同时被三个质数整除的个数,…
1-n中能被质数x整除的个数= n x \frac{n}{x} xn
1-n中能同时被质数 p 1 p_{1} p1, p 2 p_{2} p2,… p m p_{m} pm整除的个数= n ∏ k = 1 m p k \frac{n}{\prod_{k=1}^m p_{k}} k=1mpkn
可以用位运算来遍历所有的情况

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10,mod = 1e9+7;
int n,m; 
int p[20];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<m;i++) 
	scanf("%d",&p[i]);
	int res=0;
	for(int i=1;i<1<<m;i++)//位运算 
	{
		int t=1,cnt=0;//cnt是i中1的个数
		for(int j=0;j<m;j++)
		{
			if(i>>j&1)//判断第j位是否为1 
			{
				cnt++;
				if((LL)t*p[j]>n)
				{
					t=-1;
					break;
				}
				t*=p[j];
			}
		}
		if(t!=-1) 
		{
			if(cnt%2) res+=n/t;//答案加上奇数个质数的交集 
			else res-=n/t;//答案减去偶数个质数的交集 
		}
	}
	printf("%d\n",res);
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值