hdu4135容斥原理 组合遍历
容斥原理实现的关键在于:组合遍历,即如何遍历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个格雷码,则mn即为变化的那一位,log2(mn)即得下标。
接下来就可以在上一步的基础上进行加入或移除操作。
hdu4135容斥原理 组合遍历的更多相关文章
- poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合
题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- PHP正则表达式;数组:for()遍历、 foreach ()遍历、each()list()组合遍历;指针遍历
正则表达式: 1.定界符号 任何字符,一般用 // 2. 模式修正符i 写在定界符外面后面,可不区分大小写 3.preg_replace($reg,&q ...
- php两个多维数组组合遍历
$res = $this->LoanRecord->searchloan($conditions,$columns,$page,$this->num,$user_id); forea ...
- HDU 4390 Number Sequence (容斥原理+组合计数)
HDU 4390 题意: 大概就是这样.不翻译了: Given a number sequence b1,b2-bn. Please count how many number sequences a ...
- BZOJ 2839: 集合计数 [容斥原理 组合]
2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...
- 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)
3027: [Ceoi2004]Sweet Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 71 Solved: 34 Description John ...
- HDU4135(容斥原理)
Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU4135容斥原理
#include <cstdio> #include <string.h> #include <cmath> using namespace std; #defin ...
- php中的循环遍历 foreach list each
foreach语句遍历数组foreach语句用于循环遍历数组,每进行一次循环,当前数组元素的值就会被赋值给变量value(也可以是其它变量),数组指针会逐一的移动. 代码示例: foreach($ar ...
随机推荐
- [每日一题] OCP1z0-047 :2013-08-04 INSERT --- WITH CHECK OPTION
这题是考:insertWITH CHECK OPTION的用法 insert into (<select clause> WITH CHECKOPTION) values (...) 这样 ...
- 几个不同版本的framework改进
一些主要的演变过程及改进,还有很多部分不可能一一列出,下面是从1.1到4.0的一些主要改进: 一..NET Framework 1.1版本 1.ASP.NET移动控件 2.ADO.NET的改动 添加S ...
- SQL锁(转)
说 明 Chaos 无法改写隔离级别更高的事务中的挂起的更改. ReadCommitted 在正在读取数据时保持共享锁,以避免脏读,但是在事务结束之前可以更改数据,从而导致不可重复的读取或幻 ...
- ACM:图的BFS,走迷宫
题目: 一个网格迷宫由n行m列的单元格组成,每一个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,当中UDLR分别表示往上.下.左.右移动到相邻单 ...
- 数据库操作语句类型(DQL、DML、DDL、DCL)简介
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHER ...
- Android -- Camera源码简析,启动流程
com.android.camera.Camera.java,主要的实现Activity,继承于ActivityBase. ActivityBase 在ActivityBase中执行流程: onCre ...
- [Backbone]4. Model & View, toggle between Model and View. -- 1
如上图所示: Server有Data都交给Models处理, 然后由Models给Views Data,让View去告诉DOM如何显示, 然后DOM显示HTML; View events update ...
- (算法)构造MaxTree
题目: 给定一个没有重复元素的数组A,定义A上的MaxTree如下:MaxTree的根节点为A中最大的数,根节点的左子树为数组中最大数左边部分的MaxTree,右子树为数组中最大数右边部分的MaxTr ...
- uni-app 为何package.json配置以后不会生成文件?
和微信小程序不同的是uni-app 配置步骤如下 小程序是新建json生成文件夹\文件 uni-app是新建文件生成json
- Linux中-POSIX 线程详解
一种支持内存共享的简捷工具 摘自https://www.ibm.com/developerworks/cn/linux/thread/posix_thread1/ 线程是有趣的 了解如何正确运用线 ...