题目链接: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. verview of Spring Framework--转

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/overview.html 2. Introduct ...

  2. (转载)myeclipse项目名称重命名

    myeclipse项目名称重命名 实例1 今天晚上在做一个jsp唱片显示的实例,myeclipse项目名称原本想写music结果写成了musci.这就需要项目名称的重命名,单纯的使用 “重构--> ...

  3. python学习笔记--Django入门一 网页显示时间

    我的笔记是学习http://djangobook.py3k.cn/ 课程时做的,这个上边的文章讲的确实是非常的详细,非常感谢你们提供的知识. 上一篇随笔中已经配置好了Django环境,现在继续跟随ht ...

  4. checkbox复选框

    改变checkbox状态 所有的jquery版本都可以这样赋值:// $("#cb1").attr("checked","checked") ...

  5. java 反射,注解,泛型,内省(高级知识点)

     Java反射 1.Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs    取得任何一个已知名称的class的内部信息, 包括 ...

  6. [DEncrypt] Encrypt--加密/解密/MD5加密 (转载)

    点击下载  Encrypt.zip 这个类是关于加密,解密的操作,文件的一些高级操作1.Encrypt加密2.Encrypt解密3.Encrypt MD5加密看下面代码吧 /// <summar ...

  7. 黑马程序员-IO(二)

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 装饰设计模式: 当想要对已有对象进行功能增强时.可以定义类,将已经有的类传入,基于已经有的功能, ...

  8. JAVA zip解压 MALFORMED 错误

    最近在在使用zip 解压时,使用JDK1.7及以上版本在解压时,某些文件会报异常 Exception in thread "main" java.lang.IllegalArgum ...

  9. 第4条:多用类型常量,少用#define预处理指令

    定义常量的几种方式: 1.#define ANIMATION_DURAION 0.3         //定义了一个动画时长的常量, 预处理过程会把碰到的所有ANIMATION_DURAION一律替换 ...

  10. python中的“引用”和C++的引用

    python并不刻意区分“按值传递”和“按引用传递”. 在底层,python将值分为不可变对象(比如int,str)和可变对象(比如列表).所有的变量都是对某个对象的引用,赋值(=)和函数参数传递,都 ...