HDU 1796 容斥原理
2015-08-03 09:48
330 查看
点击打开题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1796
#include<cstdio>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int arr[200];
//int select[200];
int n,m,cnt,ans;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
void dfs(int cur,int lcm ,int num)
{
lcm=arr[cur]/gcd(arr[cur],lcm)*lcm;
if(num&1)
ans+=(n-1)/lcm;
else
ans-=(n-1)/lcm;
for(int i=cur+1;i<cnt;i++)
dfs(i,lcm,num+1);
}
int main()
{
ans=0;
while(~scanf("%d%d",&n,&m))
{
cnt=0;
for(int i=0;i<m;i++)
{
int x;
scanf("%d",&x);
if(x>0&&x<n)
{
arr[cnt++]=x;
}
}
for(int i=0;i<cnt;i++)
{
dfs(i,arr[i],1);
}
printf("%d\n",ans);
}
return 0;
}
#include<cstdio>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int arr[200];
//int select[200];
int n,m,cnt,ans;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
void dfs(int cur,int lcm ,int num)
{
lcm=arr[cur]/gcd(arr[cur],lcm)*lcm;
if(num&1)
ans+=(n-1)/lcm;
else
ans-=(n-1)/lcm;
for(int i=cur+1;i<cnt;i++)
dfs(i,lcm,num+1);
}
int main()
{
ans=0;
while(~scanf("%d%d",&n,&m))
{
cnt=0;
for(int i=0;i<m;i++)
{
int x;
scanf("%d",&x);
if(x>0&&x<n)
{
arr[cnt++]=x;
}
}
for(int i=0;i<cnt;i++)
{
dfs(i,arr[i],1);
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- rouser 移动脚本
- 服务器的响应数据的类型
- Mahout推荐算法API详解(实用)
- getaddrinfo函数使用
- 天声人語 20150803
- 二叉树遍历之(中序+先序,中序+后序)
- 协定类型不具有 ServiceContractAttribute 特性
- hadoop深入了解(一)
- HDU 2602 Bone Collector(01背包)
- 枚举的简单使用
- Bestcoders 回文串 Manacher 算法
- 《微软云计算Microsoft Azure部署与管理指南》即将上市!!!
- 《微软云计算Microsoft Azure部署与管理指南》即将上市!!!
- C语言文件操作函数大全(超详细)
- app 被拒,申诉 用中文-----OK!
- oracle存储过程定时执行简单例子
- webstorm快捷键
- AJAX
- 南邮 OJ 1002 求最值
- hdu5340--Three Palindromes(Mannacer算法)