容斥原理实现的关键在于:组合遍历,即如何遍历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容斥原理 组合遍历的更多相关文章

  1. poj3904 Sky Code —— 唯一分解定理 + 容斥原理 + 组合

    题目链接:http://poj.org/problem?id=3904 Sky Code Time Limit: 1000MS   Memory Limit: 65536K Total Submiss ...

  2. PHP正则表达式;数组:for()遍历、 foreach ()遍历、each()list()组合遍历;指针遍历

    正则表达式:    1.定界符号        任何字符,一般用  //    2. 模式修正符i        写在定界符外面后面,可不区分大小写    3.preg_replace($reg,&q ...

  3. php两个多维数组组合遍历

    $res = $this->LoanRecord->searchloan($conditions,$columns,$page,$this->num,$user_id); forea ...

  4. HDU 4390 Number Sequence (容斥原理+组合计数)

    HDU 4390 题意: 大概就是这样.不翻译了: Given a number sequence b1,b2-bn. Please count how many number sequences a ...

  5. BZOJ 2839: 集合计数 [容斥原理 组合]

    2839: 集合计数 题意:n个元素的集合,选出若干子集使得交集大小为k,求方案数 先选出k个\(\binom{n}{k}\),剩下选出一些集合交集为空集 考虑容斥 \[ 交集为\emptyset = ...

  6. 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)

    3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 34 Description John ...

  7. HDU4135(容斥原理)

    Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  8. HDU4135容斥原理

    #include <cstdio> #include <string.h> #include <cmath> using namespace std; #defin ...

  9. php中的循环遍历 foreach list each

    foreach语句遍历数组foreach语句用于循环遍历数组,每进行一次循环,当前数组元素的值就会被赋值给变量value(也可以是其它变量),数组指针会逐一的移动. 代码示例: foreach($ar ...

随机推荐

  1. TH文字编辑器开发的第一个游戏,唐伯虎泡妞

    使用TH编辑器开发. 游戏是我女朋友用编辑器制作的. 下载地址: http://tieba.baidu.com/p/3015237996

  2. Glusterfs初试

    Gluster的模式及介绍在此不表,这里只记录安装及配置过程. 1.整体环境 server1 : gfs1.cluster.com server2 : gfs2.cluster.com Client: ...

  3. 最小二乘法least square

    上研究生的时候接触的第一个Loss function就是least square.最近又研究了一下,做个总结吧. 定义看wiki就够了.公式如下 E(w)=12∑n=1N{y−xWT}2E(w)=12 ...

  4. NFS CIFS SAMBA 的联系和区别

    Common Internet File System, CIFS Server Message Block, SMB Network File System, NFS 在早期网络世界当中,档案数据在 ...

  5. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  6. HorizontalScrollView的使用演示样例

    MainActivity例如以下: package cc.cv; import android.os.Bundle; import android.view.LayoutInflater; impor ...

  7. 玩转OpenStack

    一.OpenStack包含那些内容 1.预备知识 首先会有虚拟化和云计算的“预备知识”,会介绍 KVM,IaaS 等技术. 2.OpenStack核心 包含OpenStack的架构和和各个核心组件. ...

  8. 13个可实现超棒数据可视化效果的Javascript框架

    随着商业及其相关需求的发展,数据成为越来越重要的元素之一,为了更加直观和明显的展示商业潜在的趋势和内在的特性,我们需要使用图表和图形的方式来直观动态的展示数据内在秘密,在今天的这篇文章中我们推荐12款 ...

  9. JavaScript操作XML (一)

    JavaScript操作XML是通过XML DOM来完成的.那么什么是XML DOM呢?XML DOM 是: 用于 XML 的标准对象模型 用于 XML 的标准编程接口 中立于平台和语言 W3C 的标 ...

  10. Android -- PullToRefresh应用

    PullToRefresh 支持ListView.ExpandableListView.GridView.WebView 下载地址:https://github.com/chrisbanes/Andr ...