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 ...
随机推荐
- CRFPP/CRF++编译安装与部署
CRFPP/CRF++编译安装与部署 下载CRF++ https://taku910.github.io/crfpp/#download 说明:在上面网站中下载CRF++ 0.58 解压 tar zx ...
- Git 学习(四)操作修改和版本穿梭
Git 学习(四)操作修改和版本穿梭 之前的章节,已介绍了本地Git库创建.暂存区增.删.改,以及提交版本库:可回顾下命令操作: git add 和 git commit. 光有之前章节的操作,Git ...
- wtforms的简单示例
1.先定义一个类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by xxx on 2017/3/13 from wtforms i ...
- 第一章 Java代码执行流程
说明:本文主要参考自<分布式Java应用:基础与实践> 1.Java代码执行流程 第一步:*.java-->*.class(编译期) 第二步:从*.class文件将其中的内容加载到内 ...
- Pow(x,n) leetcode java
题目: Implement pow(x, n). 题解: pow(x,n)就是求x的n次方.x的N次方可以看做:x^n = x^(n/2)*x^(n/2)*x^(n%2).所以利用递归求解,当n==1 ...
- 【ES】elasticsearch学习笔记
ES学习 1 优势 1.1 简单 1.1.1 相比Solor配置部署等非常简单 1.2 高效 1.2.1 ES使用Netty作为内部RPC框架,Solor使用Jetty 1.3 插件化 1.3.1 E ...
- [Functional Programming] Fst & Snd, Code interview question
cons(a, b) constructs a pair, and car(pair) and cdr(pair) returns the first and last element of that ...
- 浅谈Java两种并发类型——计算密集型与IO密集型
转载:https://blog.csdn.net/u013070853/article/details/49304099 核心是可以分别独立运行程序指令的计算单元.线程是操作系统能够进行运算调度的最小 ...
- uploadify的java应用
API:http://www.uploadify.com/documentation/ 下载地址:http://www.uploadify.com/ 这几天查看插件,发现uploadify插件做不错, ...
- C#.NET常见问题(FAQ)-如何清空stringbuilder
就红色的代码可以: System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("hello" ...