[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 ...
随机推荐
- android 67 生成和解析xml
生成xml: package com.itheima.createxml; import java.io.File; import java.io.FileNotFoundException; imp ...
- 为什么DropDownList的SelectedIndexChanged事件触发不了
写的还行,转来大家看看 为什么DropDownList的SelectedIndexChanged事件触发不了? 为什么设置了DropDownList的AutoPostBack="True&q ...
- telnet的使用
1.要打开 telnet 不是内部或外部 命令 解决方案: 程序添加删除功能,添加即可 或法二 C:\WINDOWS\system32\telnet.exe (或用C:\WINDOWS\system3 ...
- iOS UIKit:TableView之表格创建(1)
Table View是UITableView类的实例对象,其是使用节(section)来描述信息的一种滚动列表.但与普通的表格不同,tableView只有一行,且只能在垂直方向进行滚动.tableVi ...
- Silverlight OOB 程序自动更新
Silverlight OOB 程序 提供了非常方便的自动更新功能! 要让 Silverlight OOB 安装到客户端电脑后实现自动更新,必须实现以下两个条件: 一.为 程序的 xap 文件进行签 ...
- 配置SSH免密码验证
为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5183803. ...
- (八)Struts2 文件上传和下载
所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:Struts2 文件上传 Struts2 文件上传基于Struts2 拦 ...
- WPF中TreeView数据结构解析
XAML.CS代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; usi ...
- Qt5对付中文真好用
Qt好多C++程序员都在用,Qt4大家可能用的多,到了Qt5不熟悉的人到是很多,其中我喜欢的特性也是和Qt4大不一样的地方就是对中文的处理. Qt4中使用“QTextCodec::setCodecFo ...
- ThinkPHP 中使用 PHPMailer 发送邮件 支持163和QQ邮箱等
[摘要]ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的.本文介绍ThinkPHP 中使用 PHPMailer 发送邮件. PHP是自带可以发送邮件的Ma ...