题目链接: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】的更多相关文章

  1. bzoj3198[Sdoi2013]spring 容斥+hash

    3198: [Sdoi2013]spring Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1143  Solved: 366[Submit][Sta ...

  2. 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 [ ...

  3. BZOJ 3198: [Sdoi2013]spring [容斥原理 哈希表]

    3198: [Sdoi2013]spring 题意:n个物品6个属性,求有多少不同的年份i,j满足有k个属性对应相等 一开始读错题了,注意是对应相等 第i个属性只能和第i个属性对应 容斥一下 \[ 恰 ...

  4. BZOJ 3198 SDOI2013 spring

    为什么SDOI省选一年考两次容斥原理? 我们很容易发现>=k个相等时很好计算的 但是我们要求恰好k个,那么我们容斥即可 至于计算>=k个相等,首先我们枚举相等位置,对每个串对应位置做一遍h ...

  5. 3198: [Sdoi2013]spring【容斥原理+hash】

    容斥是ans= 至少k位置相等对数C(k,k)-至少k+1位置相等对数C(k+1,k)+至少k+2位置相等对数*C(k+2,k) -- 然后对数的话2^6枚举状态然后用hash表统计即可 至于为什么要 ...

  6. bzoj 3202 [Sdoi2013]项链——容斥+置换+推式子

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3202 可见Zinn博客:https://www.cnblogs.com/Zinn/p/100 ...

  7. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

  8. BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)

    传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...

  9. [SDOI2013]泉(容斥)

    /* 容斥加上哈希 首先我们可以2 ^ 6枚举相同情况, 然后对于这些确定的位置哈希一下统计方案数 这样我们就统计出了这些不同方案的情况, 然后容斥一下就好了 */ #include<cstdi ...

随机推荐

  1. android账号与同步之同步实现

    上一篇博文我先介绍了账号与同步的账号管理,这篇就介绍一下还有一部分.就是android给提供的sync同步机制的使用. 事实上sync机制的使用和上一篇博文中介绍的账号管理非常类似,也是基于binde ...

  2. Flume NG中的ElasticSearch Sink

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  3. App升级时数据库的迁移更新

    前一段时间在进行App升级的时候,由于一开始版本初期没有考虑完善,导致走了很多弯路,后来经过自己的一些思考,总结出了一些在app升级的时候,数据库内文件同步保持更新的经验,希望能给大家带来帮助. 总体 ...

  4. NDK开发之字符串操作

    在JNI中,Java字符串被当作一个引用来处理.这些引用类型并不像原生C字符串一样可以直接使用,JNI提供了Java字符串与C字符串之间转换的必要函数,因为Java字符串对象是不可变的(如果对这里有异 ...

  5. PHP表单验证内容是否为空

    内容为空效果图为: 填写内容效果图: 下面是验证程序的代码: <!doctype html> <html> <head> <meta http-equiv=& ...

  6. RedHat7安装Tomcat

    编译安装Tomcat 下载jdk (http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...

  7. jQuery滑动并响应事件

    jQuery滑动并打开指定页面: <!DOCTYPE html> <html> <head> <script src="http://code.jq ...

  8. 关于jquery获取服务器端xml数据

    其实这个很简单,但是有时候简单的东西会让你犯一些低级错误. 今天写了个spring mvc 的服务器端接口,主要是用来共享一些数据库数据. 请求字段:http://localhost:8080/XXX ...

  9. 2015前端各大框架比较(angular,vue,react,ant)

    前端流行框架大比拼 angular vue react ant-design angularjs angular是个MVVM的框架.针对的是MVVM这整个事.angular的最主要的场景就是单页应用, ...

  10. WisDom.Net 框架设计(五) 权限设计

    WisDom.Net --权限设计 1.需求分析     基本在所有的管理系统中都离不开权限管理.可以这么说,权限管理是管理系统的核心所在. 权限管理说白一些就是每个人能够做什么,不能够做什么.可以说 ...