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

How many integers can you find(容斥)

时间:2015-11-23 23:35:48      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:

How many integers can you find

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

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
 

题解:wa

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>p;
typedef long long LL;
void rc(int x){
	LL sum=0;
	for(int i=1;i<(1<<p.size());i++){
		LL num=0,cur=1;
		for(int j=0;j<p.size();j++){
			if(i&(1<<j)){
				num++;
				cur*=p[j];
			}
		}
		if(num&1)sum+=x/cur-1;
		else sum-=x/cur-1;
	}
	printf("%lld\n",sum);
}
int main(){
	int N,M,x;
	while(~scanf("%d%d",&N,&M)){
		p.clear();
		for(int i=0;i<M;i++){
			scanf("%d",&x);
			if(x==0)continue;
			p.push_back(x);
		}
		rc(N);
	}
	return 0;
}

  

 

How many integers can you find(容斥)

标签:

原文地址:http://www.cnblogs.com/handsomecui/p/4989977.html

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