题目描述

给出nnn个666维坐标,求有多少对点对满足恰好mmm个位置相等

1&lt;=n&lt;=1051&lt;=n&lt;=10^51<=n<=105

0&lt;=k&lt;=60&lt;=k&lt;=60<=k<=6

坐标数值在2302^{30}230以内

题目分析

这道题一看就是hash容斥原理,用mmm个位置对应相等−(m+1)-(m+1)−(m+1)个位置对应相等+(m+2)+(m+2)+(m+2)个位置对应相等的…

但是不能简简单单直接+/−+/-+/−,根据广义容斥,还要乘上容斥系数CkmC_{k}^{m}Ckm​

双HashHashHash,过程中遇到Hash1Hash1Hash1相同但Hash2Hash2Hash2不同的就往后平移,用数组存一下Hash1Hash1Hash1为kkk时的Hash2Hash2Hash2值与CntCntCnt值

注意此处ModModMod数要大于nnn

考试时没用双Hash,想到了做法,奈何代码太丑,这题爆0了…

AC code
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define LL long long
  4. const int MAXN = 100005;
  5. const int P1 = 137, Mod1 = 9999997;
  6. const int P2 = 167, Mod2 = 7394895;
  7. int num[MAXN][6], c[7][7], kase, n, m;
  8. struct MyHash
  9. {
  10. LL y; int flag, cnt; //y存的是Hash1为当前下标i时的Hash2值
  11. //flag是用int打标记,就不用每次清零了
  12. bool Exist() { return flag == kase; }
  13. }h[Mod1];
  14. LL Ans;
  15. void init()
  16. {
  17. for(int i = 0; i < 7; ++i)
  18. {
  19. c[i][0] = c[i][i] = 1;
  20. for(int j = 1; j < i; ++j)
  21. c[i][j] = c[i-1][j-1] + c[i-1][j];
  22. }
  23. }
  24. inline void MyUnique(LL &x, LL o)
  25. {
  26. while(h[x].Exist() && h[x].y != o) (++x) %= Mod1;
  27. }
  28. bool used[7];
  29. void dfs(int pos, int tot)//枚举当前是求哪几个位置
  30. {
  31. if(pos == 6)
  32. {
  33. if(tot < m) return; //小于m的不用处理
  34. LL sum = 0; ++kase;
  35. for(int i = 1; i <= n; ++i)
  36. {
  37. LL hsh1 = 0, hsh2 = 0;
  38. for(int j = 0; j < 6; ++j) if(used[j])
  39. hsh1 = (hsh1 * P1 % Mod1 + num[i][j]) % Mod1,
  40. hsh2 = (hsh2 * P2 % Mod2 + num[i][j]) % Mod2;
  41. MyUnique(hsh1, hsh2);
  42. if(h[hsh1].flag < kase)
  43. h[hsh1].cnt = 0, h[hsh1].flag = kase;
  44. h[hsh1].y = hsh2, sum += (h[hsh1].cnt++);
  45. }
  46. Ans += sum * (((tot-m)&1) ? -1 : 1) * c[tot][m]; //容斥
  47. return;
  48. }
  49. used[pos] = 1;
  50. dfs(pos+1, tot+1);
  51. used[pos] = 0;
  52. dfs(pos+1, tot);
  53. }
  54. int main ()
  55. {
  56. scanf("%d%d", &n, &m); init();
  57. for(int i = 1; i <= n; ++i)
  58. for(int j = 0; j < 6; ++j)
  59. scanf("%d", &num[i][j]);
  60. dfs(0, 0);
  61. printf("%lld\n", Ans);
  62. }

[Sdoi2013] [bzoj 3198] spring (hash+容斥原理)的更多相关文章

  1. [BZOJ 3198] [Sdoi2013] spring 【容斥 + Hash】

    题目链接:BZOJ - 3198 题目分析 题目要求求出有多少对泉有恰好 k 个值相等. 我们用容斥来做. 枚举 2^6 种状态,某一位是 1 表示这一位相同,那么假设 1 的个数为 x . 答案就是 ...

  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. 3198: [Sdoi2013]spring【容斥原理+hash】

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

  5. BZOJ 3198 SDOI2013 spring

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

  6. 【BZOJ 3098】 Hash Killer II

    Description 这天天气不错,hzhwcmhf神犇给VFleaKing出了一道题:给你一个长度为N的字符串S,求有多少个不同的长度为L的子串.子串的定义是S[l].S[l + 1].... S ...

  7. BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]

    4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...

  8. BZOJ 3771 Triple FFT+容斥原理

    解析: 这东西其实就是指数型母函数? 所以刚开始读入的值我们都把它前面的系数置为1. 然后其实就是个多项式乘法了. 最大范围显然是读入的值中的最大值乘三,对于本题的话是12W? 用FFT优化的话,达到 ...

  9. bzoj 2839 : 集合计数 容斥原理

    因为要在n个里面选k个,所以我们先枚举选的是哪$k$个,方案数为$C_{n}^k$ 确定选哪k个之后就需要算出集合交集正为好这$k$个的方案数,考虑用容斥原理. 我们还剩下$n-k$个元素,交集至少为 ...

随机推荐

  1. 【面试题】如何删除 ArrayList 中奇数位置的元素?

    如何删除 ArrayList 中奇数位置的元素? 面试题携程 import java.util.ArrayList; import java.util.Iterator; import java.ut ...

  2. 《Mysql - 幻读》

    一:准备 - 为了深入了解幻读,准备数据. CREATE TABLE `t` ( `id` ) NOT NULL, `c` ) DEFAULT NULL, `d` ) DEFAULT NULL, PR ...

  3. Python-04-数据结构

    一.数字 整数 Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样,例如:1,100,-8080,0,等等. 计算机由于使用二进制,所以,有时候用十六进制表示 ...

  4. PAT(B) 1069 微博转发抽奖(Java)

    题目链接:1069 微博转发抽奖 (20 point(s)) 题目描述 小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包.请你编写程序帮助他确 ...

  5. VNC的使用

    1. 安装 rpm -ivh tigervnc-server--.el6.x86_64.rpm 如果rpm安装时发现有依赖,建议直接使用yum安装,轻松解决依赖问题: yum install tige ...

  6. SQL高级教程

    一.top子句 top子句用于规定要返回的记录的数目 并非所有数据库系统都支持top子句 # sqlserver SELECT TOP number|percent column_name(s) FR ...

  7. 炫酷的可视化工具包——cufflinks

    前言 学过Python数据分析的朋友都知道,在可视化的工具中,有很多优秀的三方库,比如matplotlib,seaborn,plotly,Boken,pyecharts等等.这些可视化库都有自己的特点 ...

  8. 数据结构之队列(queue)

    队列介绍 1.队列是一个有序列表,可以用数组或是链表来实现. 2.遵循先入先出的原则.即:先存入队列的数据,要先取出.后存入的要后取出. 应用场景 比如某某银行叫号系统: 数组模拟队列 队列本身是有序 ...

  9. 上传图片,图片过大压缩处理以及解决自拍时会出现图片横屏的bug修复、长按保存图片

    js部分:module.exports = { resize: function (file, callback, options) { //配置 options = Object.assign({ ...

  10. 有用的vscode快捷键大全+自定义快捷键

    VS Code是前端的一个比较好用的代码编辑器,但是我们不能老是局限于鼠标操作呀,有时候很不方便,所以呢,快捷键大全来啦,有的可能会和你们电脑自带的快捷键冲突呢,这时候,你自己设置一下就好了呀 一.v ...