[BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】
题目链接:BZOJ - 3198
题目分析
题目要求求出有多少对泉有恰好 k 个值相等。
我们用容斥来做。
枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x 。
答案就是 sigma((-1)^(x - k) * AnsNow * C(x, k)) 。注意 x 要大于等于 k。
对于一种状态,比如 10110,就是要保证第 1, 3, 4 个值相同。
这些值相同的对数怎么来求呢?使用Hash。
将这些位上的值 Hash 成一个数,然后枚举 [1, i] , 每次求出 [1, i-1] 有多少和 i 相同的,再把 i 加入 Hash 表。
代码
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm> using namespace std; typedef long long LL; const int MaxN = 100000 + 5, Base = 11003, Mod = 10007; int n, k;
int A[MaxN][10]; LL Ans, Temp;
LL C[10][10]; void PrepareC()
{
C[0][0] = 1;
for (int i = 1; i <= 6; ++i)
{
C[i][0] = 1;
for (int j = 1; j <= i; ++j)
C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
}
} struct HashNode
{
int B[10];
int Sum;
HashNode *Next;
} HA[MaxN], *P = HA, *Hash[Mod + 5]; inline bool Cmp(int *x, int *y)
{
for (int i = 0; i < 6; ++i)
if (x[i] != y[i]) return false;
return true;
} int Get(int x, int k)
{
int Num[10];
LL HashNum = 0;
for (int i = 0; i < 6; ++i)
{
HashNum = HashNum * Base % Mod;
if (k & (1 << i))
{
Num[i] = A[x][i];
HashNum += Num[i] % Base;
HashNum %= Mod;
}
else Num[i] = 0;
}
HashNode *Now;
Now = Hash[HashNum];
int ret = 0;
while (Now)
{
if (Cmp(Now -> B, Num))
{
ret = Now -> Sum;
break;
}
Now = Now -> Next;
}
return ret;
} void Add(int x, int k)
{
int Num[10];
LL HashNum = 0;
for (int i = 0; i < 6; ++i)
{
HashNum = HashNum * Base % Mod;
if (k & (1 << i))
{
Num[i] = A[x][i];
HashNum += Num[i] % Base;
HashNum %= Mod;
}
else Num[i] = 0;
}
HashNode *Now;
Now = Hash[HashNum];
bool Flag = false;
while (Now)
{
if (Cmp(Now -> B, Num))
{
Flag = true;
++(Now -> Sum);
break;
}
Now = Now -> Next;
}
if (Flag) return;
++P; P -> Sum = 1;
for (int i = 0; i < 6; ++i) P -> B[i] = Num[i];
P -> Next = Hash[HashNum]; Hash[HashNum] = P;
} int main()
{
scanf("%d%d", &n, &k);
PrepareC();
for (int i = 1; i <= n; ++i)
for (int j = 0; j < 6; ++j)
scanf("%d", &A[i][j]);
int Cnt;
Ans = 0;
for (int i = 0; i < 64; ++i)
{
Cnt = 0;
for (int j = 0; j < 6; ++j)
if (i & (1 << j)) ++Cnt;
if (Cnt < k) continue;
Temp = 0;
memset(Hash, 0, sizeof(Hash));
P = HA;
for (int j = 1; j <= n; ++j)
{
Temp += Get(j, i);
Add(j, i);
}
if ((Cnt - k) & 1) Temp *= -1;
Ans += Temp * C[Cnt][k];
}
printf("%lld\n", Ans);
return 0;
}
[BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】的更多相关文章
- bzoj3198[Sdoi2013]spring 容斥+hash
3198: [Sdoi2013]spring Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1143 Solved: 366[Submit][Sta ...
- bzoj 3198 [Sdoi2013]spring(容斥原理+Hash)
Description Input Output Sample Input 3 3 1 2 3 4 5 6 1 2 3 0 0 0 0 0 0 4 5 6 Sample Output 2 HINT [ ...
- BZOJ 3198: [Sdoi2013]spring [容斥原理 哈希表]
3198: [Sdoi2013]spring 题意:n个物品6个属性,求有多少不同的年份i,j满足有k个属性对应相等 一开始读错题了,注意是对应相等 第i个属性只能和第i个属性对应 容斥一下 \[ 恰 ...
- BZOJ 3198 SDOI2013 spring
为什么SDOI省选一年考两次容斥原理? 我们很容易发现>=k个相等时很好计算的 但是我们要求恰好k个,那么我们容斥即可 至于计算>=k个相等,首先我们枚举相等位置,对每个串对应位置做一遍h ...
- 3198: [Sdoi2013]spring【容斥原理+hash】
容斥是ans= 至少k位置相等对数C(k,k)-至少k+1位置相等对数C(k+1,k)+至少k+2位置相等对数*C(k+2,k) -- 然后对数的话2^6枚举状态然后用hash表统计即可 至于为什么要 ...
- bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...
- BZOJ.2655.calc(DP/容斥 拉格朗日插值)
BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...
- BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)
传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...
- [SDOI2013]泉(容斥)
/* 容斥加上哈希 首先我们可以2 ^ 6枚举相同情况, 然后对于这些确定的位置哈希一下统计方案数 这样我们就统计出了这些不同方案的情况, 然后容斥一下就好了 */ #include<cstdi ...
随机推荐
- BZOJ 2754([SCOI2012]喵喵叫的星球-统计序列的后缀阵列中子序列出现次数)
2754: [SCOI2012]喵喵叫的星球 Time Limit: 20 Sec Memory Limit: 128 MB Submit: 805 Solved: 380 [id=2754&qu ...
- Choosing a Linux Tracer ------Brendan Gregg's Blog
home Choosing a Linux Tracer (2015) 08 Jul 2015 Linux Tracing is Magic! A tracer is an advanced perf ...
- GO的跨平台数扰类型
基本数据类型的包装: 1.跨平台,用于移植 2.不同的框架类型包装的类型(MFC ,WIN32SDK,C) 3.基本数据类型的组装成的结构体 4.宏定义 数字类型 Go 也有基于架构的类型,例如:in ...
- hadoop错误java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no more good datanodes being available to try
错误: java.io.IOException: Failed to replace a bad datanode on the existing pipeline due to no more go ...
- .NET 统一用户管理 -- 单点登录
单点登录 前言 本篇做为.Net 统一用户管理的系列文章的开山之作,主要说一个单点登录是怎么实现的,以及为啥要统一用户管理. 单点登录(Single Sign On),简称为 SSO,是目前比较流行的 ...
- Attribute 特性
转载 不错 摘要:纠结地说,这应该算是一篇关于Attribute 的笔记,其中的一些思路和代码借鉴了他人的文笔(见本文底部链接).但是,由于此文对Attribute 的讲解实在是叫好(自夸一下 ...
- 线性布局LinearLayout和相对布局RelativeLayout 之间的比较
LinearLayout和RelativeLayout之间: 共有属性:java代码中通过btn1关联次控件android:id="@+id/btn1" 控件宽度android:l ...
- onTextChanged参数解释及实现EditText字数监听
http://www.picksomething.cn/?p=34 由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher ...
- ITPub 上的一道题,学习下思路
有意思的,从别处看来的即可为己用--拿来主义 数据库:MS SQL 2000: drop table mytest go create table mytest ( sn int, ...
- 如何快速的将Centos6.7快速升级3.10.9
参考文档:http://www.xiexianbin.cn/linux/2015/10/15/quickly-upgrade-centos6.5-kernel-from-2.6.32-to-3.10. ...