您的位置:首页 > 其它

HDU 1796 How many integers can you find

2015-09-27 11:52 267 查看

How many integers can you find

Time Limit: 5000ms
Memory Limit: 32768KB
This problem will be judged on HDU. Original ID: 1796
64-bit integer IO format: %I64d Java class name: Main

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

Source

2008 “Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(4)

解题:容斥原理,注意有0

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 20;
int a[maxn],n,m;
LL LCM(LL a,LL b){
return a/__gcd(a,b)*b;
}
int main(){
while(~scanf("%d%d",&n,&m)){
int tot = m;
for(int i = m = 0,tmp; i < tot; ++i){
scanf("%d",&tmp);
if(tmp) a[m++] = tmp;
}
LL ret = 0;
for(int i = 1; i < (1<<m); ++i){
LL lcm = 1;
int cnt = 0;
bool flag = false;
for(int j = 0; j < m; ++j){
if((i>>j)&1){
cnt++;
lcm = LCM(lcm,a[j]);
if(lcm < 0){
flag = true;
break;
}
}
}
if(flag) continue;
if(cnt&1) ret += (n - 1)/lcm;
else ret -= (n - 1)/lcm;
}
printf("%I64d\n",ret);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: