DFS

       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 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

       思路很简单...加上一个一个的..再减去两两重复的..再加上三三多剪的..再减去四四多加的..直道做完...为了实现这个过程..用DFS..通过当前的是奇数个数还是偶数个数来判断当前是加还是剪..由于数据范围不大..最大也就10个数..最多需要的运算也只有10!=3628800...

值得注意的是..小心输入里的0..然后在做容斥的时候..每次不是简单的相乘..而是当前两数的最小公倍数..例如:

    10 2

     2  

     与

    10 2

     2  4

源码:
#include<stdio.h>
#define ll __int64
ll n,m,a[12],ans,p;

ll gcd(ll a,ll b)
{
	if(!b)
		return a;
	return gcd(b,a%b);
}


void DFS(ll i,ll w,ll k)
{
	for( ;i<=m;i++)
	{
		if(a[i])
		{
			p=a[i]*w/gcd(a[i],w);
			ans+=k*(n/p);
			DFS(i+1,p,-k);
		}
	}
	return ;
}
int main()
{
	ll i;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=1;i<=m;i++)
			scanf("%d",&a[i]);
		ans=0;
		n--;
		DFS(1,1,1);
		printf("%d\n",ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值