在计数时,必须注意无一重复,无一遗漏。为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这种计数的方法称为容斥原理。

(1)两个集合容斥关系

(2)三个集合容斥关系

公式:

这就是所谓的奇加偶减。

贴个模版题:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1796

题目解析:

这个题有bug,m可能为0。然后知道奇加偶减这个东西后,就可以深搜了,将所有组合情况全列出来,然后求lcm就好了。

求1~(n-1)中被集合m中元素中整除的个数,没学容斥原理之前做这题肯定是会超时的。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std;
int n,m,top;
__int64 a[];
int gcd(int A,int B)
{
return B==?A:gcd(B,A%B);
}
//now为当前点,num为已经加入容斥的个数,lcm记录容斥的过程值(lcm),结果
void dfs(int now,int num,__int64 lcm,__int64 &sum)
{
lcm=a[now]/gcd(a[now],lcm)*lcm;
if(num&) sum+=(n-)/lcm;
else sum-=(n-)/lcm;
for(int i=now+; i<top; i++)
dfs(i,num+,lcm,sum);
}
int main()
{
int xx;
while(scanf("%d%d",&n,&m)!=EOF)
{
top=;
for(int i=; i<m; i++)
{
scanf("%d",&xx);
if(xx!=)
{
a[top++]=xx;
}
}
__int64 sum=;
for(int i=; i<top; i++)
{
dfs(i,,a[i],sum);
}
printf("%I64d\n",sum);
}
return ;
}

最新文章

  1. 一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?
  2. Linux安装Mysql rpm
  3. JS自定义属性兼容
  4. 《DSP using MATLAB》示例Example5.5
  5. 游戏制作之路:游戏引擎选择、Mac下和Windows下UnrealEngine 4体验对比、文档及其他
  6. hdu4418(概率dp + 高斯消元)
  7. [leetcode]_Palindrome Number
  8. Asp.Net MVC Views页面不包含“GetEnumerator”的公共定义
  9. ACM hdu 1008 Elavator
  10. ssh生成密钥(供git使用)
  11. 【MS SQL】查看任务执行进度
  12. PHP高并发
  13. JDownload: 一款可以从网络上下载文件的小程序第四篇(整体架构描述)
  14. SeleniumIDE_初识
  15. Cassandra Secondary Index 介绍
  16. Golang 入门系列(六)理解Go中的协程(Goroutine)
  17. 【英文文档】 Installing Go from source Go语言官方编译指南 2019.02.27
  18. 字符串匹配的Boyer-Moore(BM)算法
  19. layui布局器网站工具
  20. 使用MYSQL的INNODB实现任务分发机制

热门文章

  1. 在程序中使用命令行的方式来调用py文件
  2. 【java】 java 设计模式(1):工厂方法模式(Factory Method)
  3. C# GetType和typeof的区别
  4. C#------各种数据库连接字符串编写
  5. docker学习-docker容器
  6. 编写一个读写倾斜测量数据.s3c文件格式的OSG插件osgdb_s3c
  7. NUC972学习历程之NUWRITER使用说明以及烧录模式的说明
  8. Docker源码分析(五):Docker Server的创建
  9. jquery类似方法的比较(三)
  10. 几种减小javascript对性能影响的方法