hdoj How many integers can you find 1796 (容斥原理&&DFS)

来源:互联网 发布:淘宝的销售金额 编辑:程序博客网 时间:2024/06/05 02:12

How many integers can you find

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


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

Sample Output
7
 
思路:
先找出从1到n之间能被给定集合内的元素整除的数的个数,再减去能被两个元素同时整除的数的个数,再加上能同时被三个数整除的数的个数,再减去.........;通过这样可以发现,“奇加偶减”这一规律。运用dfs完成。
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int a[30];int kk;int ans;int n,m;long long gcd(long long a,long long b){return b==0?a:gcd(b,a%b);}void dfs(int k,int x,int d){x=a[k]/gcd(a[k],x)*x;if(d&1)ans+=(n-1)/x;elseans-=(n-1)/x;for(int i=k+1;i<kk;i++)dfs(i,x,d+1);}int main(){int i,j,x;while(scanf("%d%d",&n,&m)!=EOF){kk=0;while(m--){scanf("%d",&x);if(x!=0)a[kk++]=x;}ans=0;for(i=0;i<kk;i++)dfs(i,a[i],1);printf("%d\n",ans);}return 0;}

0 0
原创粉丝点击