# HDU1796 简单容斥

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

#include <iostream>
#include<cmath>
#include<memory.h>
#include<algorithm>
long long n,m;
long long zhi[110];
long long he[110];
using namespace std;
long long gcd(long long a,long long b)
{
if(a==0||b==0)return 0;
long long tem;
long long q=a,w=b;
while(b)
{
tem=a%b;
a=b;
b=tem;
}
return q*w/a;
}
void dfs(long long zuobiao,long long ceng,long long zong)
{
if(ceng>m)return;
int tem=gcd(zong,zhi[zuobiao]);
if(tem>n)return ;
else
{
he[ceng]+=(n-1)/tem;
for(long long a=zuobiao+1;a<=m;a++) dfs(a,ceng+1,tem);
}
}
int main()
{
while(cin>>n>>m)
{
memset(zhi,0,sizeof(zhi));
memset(he,0,sizeof(he));
long long qq;
long long o=0;
for(qq=1;qq<=m;qq++)
{
long long k;
cin>>k;
if(k!=0)zhi[++o]=k;
}
m=o;
for(long long a=1;a<=m;a++)dfs(a,1,1);
for(long long a=1;a<=m;a++)if(!(a%2))he[a]=-he[a];
long long sum=0;
for(long long a=1;a<=m;a++)sum+=he[a];
cout<<sum<<endl;
}
return 0;
}

#### POJ1091 简单的欧几里得+简单的容斥

2016-08-28 13:09:54

#### 简单容斥

2014-07-29 16:27:01

#### hdu 3208 简单容斥原理

2015-10-12 00:23:48

#### Hdu 4451 Dressing (简单容斥)

2014-03-30 10:10:40

#### [ACM] HDU 1796 How many integers can you find (容斥原理）

2015-04-08 11:15:33

#### 容斥原理详解

2017-03-31 17:27:39

#### [JZOJ5728] 简单计数|| 容斥+处理环上问题

2018-05-24 11:47:24

#### 吉哥系列故事——礼尚往来（简单容斥问题）

2016-05-28 12:09:44

#### 容斥的原理及广义应用

2017-07-07 16:30:35

#### 容斥与反演总结

2018-01-20 22:13:01