题目链接:

http://acm.hdu.edu.cn/showproblem.php?

pid=1796

题目大意:

给你一个整数N。和M个整数的集合{A1、A2、…、Am}。集合内元素为非负数(包括零),求小于N的

正整数(1~N-1)中,能被M个整数的集合中随意一个元素整除的正整数个数。

比如N = 12。M = {2,3},在1~N-1中,能被2整除的数为{2,4,6。8。10},能被3整除的数为

{3。6,9}。则所求集合为{2,3,4。6,8,9,10},共7个,则答案为7。

思路:

就是求M个集合的并集。先看上边的样例。能被2整除的数集合S1为{2,4,6,8。10},能被3整除的数

集合S2为{3,6。9}。而两者交集S12为能被LCM(2,3) = 6整除的数为{6}。

则两者并集 S = S1 + S2 - S12。

依据容斥定理得:若有M个数,则可求出1~N-1中能被不同组合的公倍数整除的个数。

1~N-1能被公倍数整除的个数为  (N-1) / LCM。然后依据奇数项加,偶数项减的原则得出答案个数。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std; int Gcd(int a,int b)
{
if(a < b)
int temp = a, a = b, b = temp;
if(b == 0)
return a;
return Gcd(b,a%b);
} int Lcm(int a,int b)
{
return a/Gcd(a,b)*b;
} int N,M;
int A[220],Select[220]; int Solve()
{
int ans = 0;
for(int i = 1; i < (1 << M); ++i)
{
int odd = 0;
for(int j = 0; j < M; ++j)
{
if((1<<j) & i)
{
Select[++odd] = j;
}
}
int LCM = 1;
for(int j = 1; j <= odd; ++j)
LCM = Lcm(LCM,A[Select[j]]);
if(odd & 1)
ans += N/LCM;
else
ans -= N/LCM;
}
return ans;
} int main()
{
int d;
while(~scanf("%d%d",&N,&M))
{
for(int i = 0; i < M; ++i)
{
scanf("%d",&d);
if(d)
A[i] = d;
else
i--,M--;
}
N--;
printf("%d\n",Solve());
} return 0;
}

HDU1796 How many integers can you find【容斥定理】的更多相关文章

  1. hdu 1796 How many integers can you find 容斥定理

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  2. HDU 1796How many integers can you find(简单容斥定理)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  3. Codeforces Round #330 (Div. 2) B. Pasha and Phone 容斥定理

    B. Pasha and Phone Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/595/pr ...

  4. How Many Sets I(容斥定理)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3556 How Many Sets I Time Limit: 2 ...

  5. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  6. HDU 4135 Co-prime 欧拉+容斥定理

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. HDU 1695 GCD(容斥定理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. TOJ 4008 The Leaf Eaters(容斥定理)

    Description As we all know caterpillars love to eat leaves. Usually, a caterpillar sits on leaf, eat ...

  9. HDU5768Lucky7(中国剩余定理+容斥定理)(区间个数统计)

    When ?? was born, seven crows flew in and stopped beside him. In its childhood, ?? had been unfortun ...

随机推荐

  1. 手机验证 发送验证码倒计时js

    html: <input name="Tel" class="weui-input" type="tel" placeholder=& ...

  2. AngularJs轻松入门(九)与服务器交互

    AngularJs从Web服务器请求资源都是通过Ajax来完成,所有的操作封装在$http服务中,$http服务是只能接收一个参数的函数,这个参数是一个对象,用来完成HTTP请求的一些配置,函数返回一 ...

  3. PostgreSQL Replication之第一章 理解复制概念(2)

    1.2不同类型的复制 现在,您已经完全地理解了物理和理论的局限性,可以开始学习不同类型的复制了. 1.2.1 同步和异步复制 我们可以做的第一个区分是同步复制和异步复制的区别. 这是什么意思呢?假设我 ...

  4. JACOB调用控件函数

    背景介绍: 使用JAVA程序,实现对系统已安装控件方法的调用. JACOB下载地址:http://danadler.com/jacob/ 使用方法: 1.将jacob.jar添加到项目工程中 2.将j ...

  5. notepad++调用python3中文乱码

    使用notepad++,配置好快捷键调用python3,一切就绪,仿佛就差代码了,结果一使用, 中文乱码,一直没有好的解决办法. 最后只能在代码中增加一行重写向输出解决,示例如下: #!/usr/bi ...

  6. PKI 信息安全三大特性

    [机密性]发送方                                            接收方明文 M                                          ...

  7. Java基础学习总结(21)——数组

    一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的元素可以是任何数据类型,包括基 ...

  8. 全面解读Java中的枚举类型enum的使用

    这篇文章主要介绍了Java中的枚举类型enum的使用,开始之前先讲解了枚举的用处,然后还举了枚举在操作数据库时的实例,需要的朋友可以参考下 关于枚举 大多数地方写的枚举都是给一个枚举然后例子就开始sw ...

  9. Java实现断点续传。

    http://www.cnblogs.com/liaojie970/p/5013790.html

  10. cocos2d-x 显示触摸操作(显示水波点击效果,用于视频演示)

    昨天刚刚參加玩游戏设计大赛, 积累了一些东西. 接下去将会逐个分享出来. 首先是显示触摸操作. 由于要演示我们的作品.使用试玩过程中, 假设没办法显示我们的触摸操作(像录制视频一样, 点击了屏幕某点, ...