ACM: How many integers can you find-数论专题-容斥原理的简单应用+GCD

How many integers can you find

Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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

12 2
2 3

Sample Output

7
/*/
题意:
给出N和M 输入M个数,找出所有M个数的倍数并且,Mi的倍数小于N,输出所有数的总个数。 

如果一个数同时是三个数的倍数
单独记一个数的倍数次数为C(3,1) =3
记两个数的倍数次数为 C(3,2)=3
记三个数的倍数次数为 C(3,3)=1
3-3+1=1,只记一次依次类推

一个数为5个数的倍数
C(5,1)=5
C(5,2)=10
C(5,3)=10
C(5,4)=5
C(5,5)=1
5-10+10-5+1=1

六个数
C(6,1)=6
C(6,2)=15
C(6,3)=20
C(6,4)=15
C(6,5)=6
C(6,6)=1
6-15+20-15+6-1=1

然后因为数字不超过10个,可以运用枚举子集的思想去做这个题目。
所以用到DFS。
最后有一个地方要注意就是在DFS里面判断积这里,要用GCD,一开始没想到过不了样例。 

AC代码:
/*/
#include"map"
#include"cmath"
#include"string"
#include"cstdio"
#include"vector"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
typedef long long LL;

LL a[15];
int n,m,cnt;
LL ans,x;

LL gcd(LL a,LL b){
	return b?gcd(b,a%b):a;
}

void DFS(int x,LL axb,int num) {
	axb=a[x]/gcd(a[x],axb)*axb;
	if(num&1) ans+=(n-1)/axb;
	else ans-=(n-1)/axb;
	//	cout<<"now ans is:"<<ans<<endl;  //检查
	for(int i=x+1; i<cnt; i++)
		DFS(i,axb,num+1);
}

int main() {
	while(~scanf("%d%d",&n,&m)) {
		ans=0;
		cnt=0;
		for(int i=0; i<m; i++) {
			scanf("%I64d",&x);
			if(x!=0)a[cnt++]=x;
		}
		for(int i=0; i<cnt; i++){
			DFS(i,a[i],1);       //用DFS去枚举每种选择的情况。
		}
		printf("%d\n",ans);
	}
	return 0;
}

  

时间: 2024-10-13 00:05:11

ACM: How many integers can you find-数论专题-容斥原理的简单应用+GCD的相关文章

数论专题总结

数论专题总结 kuangbin带你飞之数论基础专题已经刷的差不多了,剩下三道一道中国剩余定理一道离散对数还有一道模拟,模拟那道应该是不会去做了,离散对数的那道看了很多题解一直没有理解题目的思路,只能先暂时放放了,中国剩余定理那道是刘汝佳大白书的例题,暂时没思路也只能先放放了,以后有机会再看下大白书,中国剩余定理已经了解了,离散对数的BSBS模版也有了,虽然这两道变形题暂时不会,但是数论专题部分基础已经有一些了,刷该专题的目标已经完成了,下一专题:kmp. 待补充......

HDU 1796 How many integers can you find(组合数学-容斥原理)

How many integers can you find 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

ACM学习历程—HDU 5446 Unknown Treasure(数论)(2015长春网赛1010题)

Problem Description On the way to the next secret treasure hiding place, the mathematician discovered a cave unknown to the map. The mathematician entered the cave because it is there. Somewhere deep in the cave, she found a treasure chest with a com

ACM:数论专题(3)——约瑟夫问题

(p.s: 以前做约瑟夫问题都是用链表模拟,今天发现了一个效率更高的方法,受教了...) 题目描述: 小Hi和小Ho的班级正在进行班长的选举,他们决定通过一种特殊的方式来选择班长. 首先N个候选人围成一个圈,依次编号为0..N-1.然后随机抽选一个数K,并0号候选人开始按从1到K的顺序依次报数,N-1号候选人报数之后,又再次从0开始.当有人报到K时,这个人被淘汰,从圈里出去.下一个人从1开始重新报数. 也就是说每报K个数字,都会淘汰一人.这样经过N-1轮报数之后,圈内就只剩下1个人了,这个人就作

ACM: POJ 1061 青蛙的约会 -数论专题-扩展欧几里德

POJ 1061 青蛙的约会 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%lld & %llu Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰

ACM数论之旅3---最大公约数gcd和最小公倍数lcm(苦海无边,回头是岸( ̄? ̄))

gcd(a, b),就是求a和b的最大公约数 lcm(a, b),就是求a和b的最小公倍数 然后有个公式 a*b = gcd * lcm     ( gcd就是gcd(a, b), ( •?∀•? ) 简写你懂吗) 解释(不想看就跳过){ 首先,求一个gcd,然后... a / gcd 和 b / gcd 这两个数互质了,也就是 gcd(   a / gcd ,b / gcd  )  =  1,然后... lcm = gcd *  (a / gcd) * (b / gcd) lcm = (a *

ACM学习历程—BZOJ2956 模积和(数论)

Description 求∑∑((n mod i)*(m mod j))其中1<=i<=n,1<=j<=m,i≠j. Input 第一行两个数n,m. Output 一个整数表示答案mod 19940417的值 Sample Input 3 4 Sample Output 1 样例说明 答案为(3 mod 1)*(4 mod 2)+(3 mod 1) * (4 mod 3)+(3 mod 1) * (4 mod 4) + (3 mod 2) * (4 mod 1) + (3 mod

数论专题(转)

经过长时间的试验,发现果然学编程还是要学好数学先,数学引发的更加有质的变化,而盲目学各种编程语言也不能获得一种不一样的体验,或者我没掌握到诀窍.另外打算从这学期学的 信安数学基础 学到的庞大的数论体系开刀,上了这课明显体会到彻底自学就是扯蛋. 网上找到这份题目,还不错的赶脚,刷起! 2014-11-11开始刷起,有链接表示KO 博弈论POJ 2234 Matches GamePOJ 2975 NimPOJ 2505 A multiplication gamePOJ 1067 取石子游戏POJ 2

URAL 1907. Coffee and Buns(数论推导+容斥原理)

1907. Coffee and Buns Time limit: 1.0 second Memory limit: 64 MB Planet Ataraxia is known for its education centers. The people who are expected to take high social positions in future are brought up in conditions of continuous training and supervisi