容斥原理实现的关键在于:组合遍历,即如何遍历2^n种组合。
容斥原理的三种写法:

  • DFS
  • 队列数组
  • 位数组
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
const int maxn = 32000;
bool isPrime[maxn];
int prime[maxn / 4], psize;//线性筛法必须用数组存储现有质数
int p[40], ps;
typedef long long ll;
void init(){memset(isPrime, 1, sizeof(isPrime));psize = 0;for (int i = 2; i < maxn; i++){if (isPrime[i]){prime[psize++] = i;}for (int j = 0; j < psize&&prime[j] * i < maxn; j++){isPrime[i*prime[j]] = false;if (i%prime[j] == 0)break;}}
}
void parse(ll x){ps = 0;for (int i = 0;i<psize; i++){if (x%prime[i] == 0){p[ps++] = prime[i];while (x%prime[i] == 0)x /= prime[i]; if (x == 1)return;}}if (x>1){p[ps++] = x;}
}
ll dfs(ll ind, ll n, ll x){ll s = 0;for (int i = ind; i < ps; i++){s += n / p[i] - dfs(i + 1, n / p[i], x);}return s;
}
ll huzhi(ll n, ll x){return  n - dfs(0, n, x);
}
int main(){freopen("in.txt", "r", stdin);init(); int T; scanf("%d", &T);int caseid = 1;ll A, B, N;while (T--){cin >> A >> B >> N;ll ans;if (N == 1){ans = B - A+1;}else{parse(N);ans = huzhi(B, N) - huzhi(A-1, N);}printf("Case #%d: %I64d\n", caseid++, ans);}return 0;
}

队列数组法实现容斥原理:

__int64 haha(__int64 m) //用队列数组实现容斥原理{__int64 que[10000], t = 0, sum = 0;que[t++] = -1;for (int i = 0; i < num; i++) {int k = t;//保存一层for (int j = 0; j < k; j++)que[t++] = que[j] * a[i] * (-1);}for (int i = 1; i < t; i++)sum = sum + m / que[i];return sum;
}

队列数组实现容斥原理的思想就是:让下列元素按顺序进队列:

  • 1=1+空 ----1处理完了
  • 2=2+空
  • 12=2+1 ----2处理完了
  • 3=3+空
  • 13=3+1
  • 23=3+2
  • 123=3+12 ---3处理完了

队列数组需要开辟一个队列来存储过去的元素,浪费空间。但是它对于每种组合,它没有从头开始计算,而是按照一定的顺序在过去基础上计算。借鉴这个思想,位数组不一定每次都需要从头计算,可以通过格雷码来表示位数组,这样每次只变化1位,不需要额外空间,兼具队列数组和位数组的优点。

如何获取变化的那一位呢?记m为第i+1个格雷码,n为第i个格雷码,则m^n即为变化的那一位,log2(m^n)即得下标。
接下来就可以在上一步的基础上进行加入或移除操作。

转载于:https://www.cnblogs.com/weiyinfu/p/6369853.html

hdu4135容斥原理 组合遍历相关推荐

  1. UPC-排课表+玉米田(容斥原理+组合数学公式)

    排课表 时间限制: 1 Sec 内存限制: 128 MB [提交] [状态] 题目描述 新学期伊始,作为玉米高中的教务主任W某,又要安排学生们的课程表了. W某想要知道所有可能的排课表方案,于是他开始 ...

  2. java 组合 遍历 算法_java编程n个集合每次从每个集合里面取出一个元素组成一个字符串列出所有组合算法...

    展开全部 import java.util.ArrayList; import java.util.List; public class XX { 62616964757a686964616fe789 ...

  3. 位运算与组合搜索(二)

    People who play with bits should expect to get bitten. -- Jurg Nievergelt I failed math twice, never ...

  4. 【飞秋】位运算与组合搜索(二)

    这篇文章接着讲怎样高效地遍历所有的组合.同样,假定全集的大小不大于机器字长,计算模型为 word-RAM,即诸如 +, –, *, /, %, &, |, >>, << ...

  5. map遍历+reduce求和

    <script th:inline="javascript"> $.get("http://mall.com/api/ware/wareinfo/fare?a ...

  6. OI每周刷题记录——lrllrl

    看这标题就知道我是模仿的hzwer大佬,远程%%% 大佬的OI经历让蒟蒻我深受感触,为了晚一些AFO本蒟蒻也得加油了 从高二上期第一周开始计数,每个星期天更一次,一直更到我AFO 如果这是我此生最后一 ...

  7. 第一章 软件自动化测试的基础知识

    测试工具以及测试方法并不能代表自动化测试,大多数人提到自动化测试,都会说会使用什么工具或者什么技术,这完全是错误的,和我在刚接触的时候一样,以为掌握了Selenium/QTP就以为自己是一名自动化测试 ...

  8. 2022年想成为软件测试工程师,这个学习路线收藏起来

    近两年来,自动化测试工程师越来越火了,薪资待遇也快接近开发工程师了. 企业对于自动化测试的需求量也越来越高 什么样的项目适合自动化测试 如上图所示,真正工作中无法全部满足以上条件,所以需要作出权衡,一 ...

  9. 阿里疯传,手把手教你如何从0开始开展UI自动化测试?

    如何进行一个Web项目的UI自动化测试,首先需要建立一个自动化测试团队.理想情况下,该团队由四个人组成,即测试和开发工程师.中高级自动化测试工程师和两名初级自动化工程师.在非理想情况下,可能只需要一个 ...

最新文章

  1. 基于Netty实现的轻量级分布式服务框架
  2. if,elif,else的关系 input print int的用法
  3. OpenCV学习笔记(七):访问图像中像素的三类方法
  4. php使用mkdir创建多级目录入门例子
  5. 广度优先搜索_计算机入门必备算法——广度优先遍历搜索
  6. 补码为什么要取反加1?
  7. centos php 开启socket,CentOS 配置PHP支持socket扩展
  8. Asp.Net开通支付宝PC端网页支付
  9. SQL Server 锁升级阈值
  10. python中hub_PyHubWeekly | 第一期:Github上那些值得推荐的Python小工具
  11. html是一种制作万维网页面的标准语言,计算机网络基础练习选择题
  12. PS大神最全脑洞合集
  13. android侧滑菜单 动画,Android 打造完美的侧滑菜单/侧滑View控件
  14. SAP 业务技术平台(BTP) Workflow(工作流)功能介绍
  15. MacBook 强制关机的四种方法
  16. LOL全英雄皮肤爬虫
  17. 个人形象设计之色彩季型分析
  18. 用HTML+CSS+JS做一个漂亮的个人网页
  19. badger和rocksDB性能对比
  20. 校园跳蚤市场信息管理c语言,C语言 习题课.ppt

热门文章

  1. [luogu3198] 玩具装箱
  2. Qt富文本编辑器QTextDocument
  3. Python代码之三级登录
  4. 怎样区分直连串口线和交叉串口线?
  5. 有什么工具或应用可以帮助找到适合搭配一种颜色的另一种颜色?
  6. ASP.net的PDF打印(水晶报表)[摘]
  7. 在Struts 2中使用JSON Ajax
  8. 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot
  9. pom模块依赖关系梳理
  10. 电脑故障扫描修复软件_非常时期不出门,自己在家修电脑,三例常见电脑故障排除方法。...