容斥原理的二进制实现模版
最近学习容斥原理,实现容斥原理大致有三种方法:dfs,队列数组,二进制。
今天主要讲下二进制实现容斥原理:
有一个集合{A1……An},求集合的子集?很显然答案为
也就是2^n个,也就是每一个子集有唯一标志符 i (0<i<2^n,空集除外),也就是说有唯一的二进制表示!
代码看下面的:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<cstring> 7 #include<vector> 8 #include<stdlib.h> 9 using namespace std; 10 int prime[40000],m; 11 bool f[40000]; 12 vector<int>p;//存放质因数 13 //用筛法初始化40000以内的质数,将质数存放在prime数组中,m记录大小 14 int init(){ 15 m=0; 16 for(int i=2; i<40000; i++){ 17 if (f[i]==0) prime[m++]=i;//质数 18 //筛去合数 19 for (int j=0; j<m&&i*prime[j]<40000; j++){ 20 f[i*prime[j]]=1; 21 if (i%prime[j]==0) break;//保证每个数只筛去一次 22 } 23 } 24 } 25 //对n分解质因数 26 void factor(int n){ 27 p.clear(); 28 for (int i=0; i<m&&prime[i]*prime[i]<=n; i++){ 29 if (n%prime[i]==0){ 30 p.push_back(prime[i]); 31 n/=prime[i]; 32 while (n%prime[i]==0) 33 n/=prime[i]; 34 } 35 } 36 if(n>1) p.push_back(n); 37 } 38 //用二进制实现容斥原理,求区间[1,r]内与n互素的数的个数 39 int solve(int r){ 40 int sum = 0; 41 //i的范围是1-2^p.size(),空集除外,每一个子集所对应的 42 //二进制都不一样,也就是i 43 for (int i=1; i<(1<<p.size()); ++i){ 44 int mult = 1,bits = 0; 45 for (int j=0; j<p.size(); ++j) 46 if (i&(1<<j)){//与i的二进制的第j位比较,看是否为1,是则选中 47 bits++;//计算i中1的个数,也就是质因数的个数 48 mult *= p[j]; 49 } 50 int cur = r / mult; 51 if (bits & 1)//若1的个数是奇数则进行加法,否则进行减法 52 sum += cur; 53 else sum -= cur; 54 } 55 return r - sum;//用总的数目-与n不互素的个数 56 } 57 int main(){ 58 init(); 59 int n,r; 60 while(cin>>n>>r){ 61 factor(n); 62 cout<<solve(r)<<endl; 63 } 64 return 0; 65 }
转载于:https://www.cnblogs.com/xin-hua/p/3213050.html
容斥原理的二进制实现模版相关推荐
- 容斥原理(二进制枚举)
在计数时,必须注意无一重复,无一遗漏.为了使重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计 ...
- 【 HDU - 1796】How many integers can you find (容斥原理,二进制枚举或者dfs)
题干: Now you get a number N, and a M-integers set, you should find out how many integers which are sm ...
- 容斥原理(二进制实现)
链接: hdu 1796 How many integers can you find 代码: #include <bits/stdc++.h> using namespace std; ...
- 背包问题的二进制优化
01背包问题 图解+详细解析 (转载) 01背包问题 图解+详细解析 (转载)_迪迦 • 奥特曼-CSDN博客 01背包问题 图解+详细解析 (转载)_可控的事情要谨慎,不可控的事情要乐观.-CSDN ...
- ACM-ICPC 2018 沈阳赛区网络预赛 Spare Tire(容斥+公式推)
A sequence of integer \lbrace a_n \rbrace{an} can be expressed as: \displaystyle a_n = \left\{ \beg ...
- 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(10)签到题2题
Solved Pro.ID Title Ratio(Accepted / Submitted) 1001 Pty loves sequence 25.00%(52/208) 1002 Pty with ...
- 矩阵树定理(Kirchhoff || Laplace)初探——Part 1(无向图计数)
必备知识: 高斯消元,图论基本知识(好像就这...(雾)) 这里是无向图部分,请不要走错场... 定义 我们将邻接矩阵定义为矩阵\(A(u,v)\),我想邻接矩阵就不用再多说了: 我们将每个点的度数矩 ...
- NYOJ 647 奋斗小蜗牛在请客【模拟】
原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=647 思路:没啥说的,本想用java写,没找到double进制转换的对应函数..就该用c+ ...
- HDU - 1796——容斥原理+二进制枚举
[题目描述] Now you get a number N, and a M-integers set, you should find out how many integers which are ...
最新文章
- Java、Apache Tomcat下载与安装及环境变量配置
- 智慧城轨信息技术架构及信息安全规范_在深圳,我们打造智慧地铁的“最强大脑”...
- spring可用于数据层吗_Spring XD用于数据提取
- indexOf、lastIndexOf、substring等详解
- java精通时间_你真的精通 Java 吗?
- 开发了一套python的七牛sdk
- CCF201809-2 买菜
- Xcode 代码格式化/自动排版
- 最新微信公众平台JS逆向分析
- java虚拟机之虚拟机类加载机制
- 微服务笔记(二) 服务发现
- 超分辨率重建测试(DASR)
- [小O地图-图表] - 制作全国行政区图表
- JanusGraph 数据模型
- 微信小程序之 收藏功能
- PySpark与GraphFrames的安装与使用
- 小米android隐藏游戏,MIUI8小米手机开启隐藏选项
- 面试必问题之Docker分布式搭建
- python 使用pika对接rabbitMQ
- unity快速进入Project窗口文件夹
热门文章
- 基于墨刀实现的短视频分享软件原型设计
- 20180307:python接口测试时json的传参与解析区分
- 《构建之法》阅读笔记01
- 改善代码可测性的若干技巧
- 亲和数 杭电2040
- linux下vi编辑器常用命令
- 去除标题_资深运营导师-云中教你轻松写标题
- svn locked解决方法
- java 常用流_Java流类图结构: 流的概念和作用流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数...
- springmvc,spring,hibernate5.0整合