# HDU1796 简单容斥

80人阅读 评论(0)

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;
}
0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：27039次
• 积分：3190
• 等级：
• 排名：第10792名
• 原创：308篇
• 转载：0篇
• 译文：0篇
• 评论：8条
评论排行
最新评论