容斥原理的二进制实现模版

最近学习容斥原理,实现容斥原理大致有三种方法: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试鼠标双击_鼠标环境可靠性测试是什么

鼠标和电脑是的组合&#xff0c;购买电脑时一般商家会送给用户一个配套的鼠标&#xff0c;鼠标和电脑一样&#xff0c;对环境的要求较高&#xff0c;极少部分的鼠标由于短路或者是环境温度过高的问题会导致鼠标出现自燃的现象&#xff0c;如果用户此时正在使用电脑编辑文件&…

snprintf函数用法

int snprintf(char *restrict buf, size_t n, const char * restrict format, ...); 函数说明:最多从源串中拷贝n&#xff0d;1个字符到目标串中&#xff0c;然后再在后面加一个0。所以如果目标串的大小为n 的话&#xff0c;将不会溢出。 函数返回值:若成功则返回欲写入的字符…

virtualbox主机网络管理 未能创建_如何在 VirtualBox 中增加现有虚拟机的磁盘大小 | Linux 中国...

导读&#xff1a;你可以在 VirtualBox 中扩大虚拟硬盘&#xff0c;即使在创建之后也可以。                   本文字数&#xff1a;1434&#xff0c;阅读时长大约&#xff1a;2分钟https://linux.cn/article-12869-1.html作者&#xff1a;Dimitrios Savvopoulos译者…

java 迪米特法则_迪米特法则

文章首发于个人博客 shuyi.tech&#xff0c;欢迎点击原文跳转阅读。 设计模式说白了就是传统经验的总结&#xff0c;它能让我们在合适的场景使用合适的模式&#xff0c;从而加快我们的编程速度&#xff0c;也能提高系统的扩展性、稳定性。这里我想就设计模式提出两个观点&#…

js中的==与===的区别

""&#xff1a; 1&#xff0c;如果两表达式的类型不同&#xff0c;则试图将它们转换为字符串、数字或 Boolean 量。 2&#xff0c;NaN 与包括其本身在内的任何值都不相等。 3&#xff0c;负零等于正零。 4&#xff0c;null 与 null 和 undefined 相等。 5&#x…

sql 2000 安装问题

1. 安装时报command line option syntax error.type command /?for help 去掉安装文件的中文路径 2. 安装完成后&#xff0c;打开企业管理器&#xff0c;出现mmc无法初始化管理单元。 原因是之前安装的sqlserver2000没有卸载干净 1) 彻底删除C:\Program Files\Microsoft SQL …

mysql 交换工资_LeetCode:627.交换工资

题目给定一个 salary 表&#xff0c;如下所示&#xff0c;有 m 男性 和 f 女性 的值。交换所有的 f 和 m 值(例如&#xff0c;将所有 f 值更改为 m&#xff0c;反之亦然)。要求只使用一个更新(Update)语句&#xff0c;并且没有中间的临时表。注意&#xff0c;您必只能写一个 …

usb长包数据结束判断_如何判断南桥好坏 判断南桥好坏方法介绍【详解】

南桥是电脑里重要的零部件&#xff0c;南桥芯片主要是负责I/O接口等一些外设接口的控制、IDE设备的控制及附加功能等等。那么南桥发生故障&#xff0c; 怎么判断南桥好坏 呢?一、通过测PCI槽、AGP槽对地打阻值可判定南北桥有无损坏1、PCI槽中所有的AD复合线对地打阻值都为300&…

C++ MFC界面读写USB HID设备数据程序

发一个简单易用的界面&#xff0c;用来对USB HID设备&#xff08;比如说游戏手柄&#xff0c;控制面板等&#xff09;读写数据&#xff0c;一般情况下面板上有一些LED&#xff0c;可以帮助我们测试读写是否正确。另外&#xff0c;需要可以修改vendorID和prodcutID,这样一个界面…

nano-pc-t1 4412 显示驱动分析

1. 和其它内核代码类似。 显示驱动的分析都是由 drivers/video/fbmem.c开始&#xff0c;fbmem.c是显示驱动的抽象&#xff0c;实际只是一个框架性的东西。 fbmem_init 中实现了一个字符设备驱动&#xff0c;并创建了class&#xff0c;但是没有生成设备文件。 这个字符设备驱动的…

mysql中索引约束有哪些_Mysql中索引和约束的示例语句

外键查询一个表的主键是哪些表的外键SELECTTABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAMEFROMINFORMATION_SCHEMA.KEY_COLUMN_USAGEWHERETABLE_SCHEMA mydbnameAND REFERENCED_TABLE_NAME 表名;导出所有外键语句SELECTCONCAT(ALTER …

taskkill无法终止进程 拒绝访问_解决删除文件时,提示无法删除的问题

有时我们想删除某个程序文件夹&#xff0c;或是卸载后残留的一些 .dll 等后缀的文件&#xff0c;却一直提示 “运行中” 、 “权限不足” &#xff0c;甚至用第三方的强力删除功能都无法删除。这时我们可以用系统自带的命令行功能&#xff0c;使用几个简单的小命令就可以彻底删…

javascript删除数组里的对象

Array.prototype.del function(value) {//删除数组中指定的元素&#xff0c;返回新数组function hasValue(array, value) {for(var i 0; i < array.length; i) {if (value array[i]) {return i;}}return -1;}var position hasValue(this, value);var temp new Array ;i…

擦窗机器人测试标准_擦窗机器人,我选择玻妞的三个理由!

很多人都喜欢高层&#xff0c;一览无遗&#xff0c;广阔风景&#xff01;可现实是无论什么高层湖景都会被窗户上日积月累的灰尘遮挡的严严实实&#xff0c;每次擦窗都累到怀&#xff01;疑&#xff01;人&#xff01;生&#xff01;于是一年又一年&#xff0c;你想要的风景始终…

Oracle客户端与java_Oracle 谈 JavaFX 及 Java 客户端技术的未来

原标题&#xff1a;Oracle 谈 JavaFX 及 Java 客户端技术的未来据 Oracle 博客称&#xff0c;从 JDK 11 开始&#xff0c;Oracle 将从 JDK 中删除 JavaFX&#xff0c;但在 2022 年之前&#xff0c;Oracle 还会继续为 JDK 8 中的 JavaFX 提供商业支持。2011 年&#xff0c;JavaF…

基于Passthru的NDIS开发的个人理解

基于Passthru的NDIS开发的个人理解 这几天对NDIS的学习&#xff0c;基本思路是&#xff1a;首先熟悉理论知识→然后下载一个例子进行研究→最后例子自己模仿扩展→最最后尝试自己写一个新的。 Passthru是微软NDIS自己写的一个框架驱动&#xff0c;NDIS开发者可以在此框架上进行…

Conversion to Dalvik format failed with error 1

如题&#xff0c;解决办法是将工程中的 Android Private Libraries移除即可

char类型包括数字吗java_Java char 与 Character

1. java中char类型占2个字节、16位能够存放汉子&#xff0c;字母和数字占一个字节&#xff0c;一个字节8位&#xff0c;中文占2个字节&#xff0c;16位&#xff1b;java2. char类型赋值编码char a’a’; //任意单个字符&#xff0c;加单引号。char a’中’;//任意单个中文字&am…

HDOJ 4253 Two Famous Companies 二分+MST

题目意思&#xff1a;给出n个点&#xff0c;m条边&#xff0c;边分为两种&#xff0c;一种是A公司的&#xff0c;一种是B公司的。边上有权值&#xff0c; 问用n-1条边把n个点连起来的最小费用是多少&#xff0c;其中A公司的边刚好有k条。题目保证有解。 题解&#xff1a;题目意…

低代码开发平台_低代码开发平台测评——伙伴云

​本次测评的产品严格来说不算低代码开发平台&#xff0c;它自己给自己的定位更多是全流程数据生产力平台。不过它依然具备应用搭建的关键要素&#xff0c;而且在数据管理方面还比较出彩&#xff0c;所以不能放过它——伙伴云&#xff0c;这款由Discuz&#xff01;主创团队操刀…