首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【HDU】1796 - How many integers can you find(容斥原理,GCD)

【HDU】1796 - How many integers can you find(容斥原理,GCD)

作者头像
FishWang
发布2025-08-27 09:01:01
发布2025-08-27 09:01:01
15100
代码可运行
举报
运行总次数:0
代码可运行

点击打开题目

How many integers can you find

Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6760 Accepted Submission(s): 1961

Problem Description

Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer set is {2,3}, so there is another set {2,3,4,6,8,9,10}, all the integers of the set can be divided exactly by 2 or 3. As a result, you just output the number 7.

Input

There are a lot of cases. For each case, the first line contains two integers N and M. The follow line contains the M integers, and all of them are different from each other. 0<N<2^31,0<M<=10, and the M integer are non-negative and won’t exceed 20.

Output

For each case, output the number.

Sample Input

代码语言:javascript
代码运行次数:0
运行
复制
   12 2
2 3

Sample Output

代码语言:javascript
代码运行次数:0
运行
复制
   7

Author

wangye

Source

2008 “Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(4)

有几点需要注意:

①m里的值可能是0

②m的值可能不互质,这时候取数的时候不能直接相乘,要求LCM( )

③m里的数可能大于等于n

④n要减一

代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
#include <cstdio>
#include <cstring>
int GCD(int a,int b)
{
	if (a % b == 0)
		return b;
	return GCD(b,a%b);
}
int LCM(int a,int b)
{
	return a/GCD(a,b)*b;
}
int main()
{
	int n;
	int m;
	int num[30];
	while (~scanf ("%d %d",&n,&m))
	{
		for (int i = 0 ; i < m ; i++)
		{
			scanf ("%d",&num[i]);
			if (num[i] < 1 || num[i] >= n)		//大于等于n的也要删掉 
			{
				m--;
				i--;
			}
		}
		//用容斥原理直接求
		n--;
		int ans = 0;
		for (int i = 1 ; i < (1 << m) ; i++)
		{
			int v = 1;
			int k = 0;		//计数
			for (int j = 0 ; j < m ; j++)
			{
				if ((1 << j) & i)
				{
					v = LCM(v,num[j]);
					k++;
				}
			}
			if (k & 1)
				ans += n / v;
			else
				ans -= n / v;
		}
		printf ("%d\n",ans);
	}
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • How many integers can you find
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档