博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
容斥原理的二进制实现模版
阅读量:5125 次
发布时间:2019-06-13

本文共 1118 字,大约阅读时间需要 3 分钟。

最近学习容斥原理,实现容斥原理大致有三种方法:dfs,队列数组,二进制。

今天主要讲下二进制实现容斥原理:

   有一个集合{A1……An},求集合的子集?很显然答案为

也就是2^n个,也就是每一个子集有唯一标志符 i (0<i<2^n,空集除外),也就是说有唯一的二进制表示!

代码看下面的:

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std;10 int prime[40000],m;11 bool f[40000];12 vector
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
<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
<=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 //二进制都不一样,也就是i43 for (int i=1; i<(1<
>n>>r){61 factor(n);62 cout<
<

 

转载于:https://www.cnblogs.com/xin-hua/p/3213050.html

你可能感兴趣的文章
第二次团队冲刺--2
查看>>
VMware Tools安装
查看>>
Linux上架设boost的安装及配置过程
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
zoj 2286 Sum of Divisors
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
OpenCV之响应鼠标(三):响应鼠标信息
查看>>
Android 画图之 Matrix(一)
查看>>
List<T>列表通用过滤模块设计
查看>>
【模板】最小生成树
查看>>
设计模式之结构型模式
查看>>
poj2569
查看>>
使用pygal_maps_world.i18n中数据画各大洲地图
查看>>
sql server必知多种日期函数时间格式转换
查看>>
jQuery EasyUI 的下拉选择combobox后台动态赋值
查看>>
timeline时间轴进度“群英荟萃”
查看>>
python if else elif statement
查看>>
网络编程
查看>>
文本隐藏(图片代替文字)
查看>>
java面试题
查看>>