码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 1796 How many integers can you find 容斥入门

时间:2016-05-09 22:13:37      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:

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
 

 

题意:

   给你m个数的集合,给你一个n问你小于n并且是这m个数里面的数的倍数有多少

题解:

   dfs容斥原理

   奇数偶数加减法

#include<bits/stdc++.h>
using namespace std;
const int N = 3e6+20, M = 1e6+10, mod = 1e9+7,inf = 1e9+1;

typedef long long ll;

ll ans;
int x,a[N],n,m;
ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);}
void dfs(int i,int num,ll tmp) {
     if(i>=m) {
        if(num==0) ans=0;
        else {
            if(num&1) ans = (ans+n/tmp);
            else ans = ans - n/tmp;
        }
        return ;
     }
     dfs(i+1,num,tmp);
     dfs(i+1,num+1,tmp*a[i]/gcd(tmp,a[i]));
}
int main() {
    while(scanf("%d%d",&n,&m)!=EOF) {
        int k = 0;
        n--;
        for(int i=1;i<=m;i++) {
            scanf("%d",&x);
            if(x) a[k++] = x;
        }
        m = k;
        ans = 0;
        dfs(0,0,1);
        printf("%I64d\n",ans);
    }
    return 0;
}

 

 

HDU 1796 How many integers can you find 容斥入门

标签:

原文地址:http://www.cnblogs.com/zxhl/p/5475471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!