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

【思路】

容斥原理+Hash

恰有k个元素相同的对数=至少k+1个相同*C(k+1,k) - 至少k+2个相同*C(k+2,k) + ……

枚举状态i,如果是101表示至少1和3两个相同,把n个年份关于i构造一个hash,然后放入hash中统计。这里只是关于位是1的构造hash,其他位都忽略了,所以得到的是至少有多少个相同的数目。

学了个hash表的写法,新姿势get :)

【代码】

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. typedef unsigned long long ull;
  8. typedef long long ll;
  9. const int N = ;
  10. const int B = ;
  11.  
  12. namespace Hash_set
  13. {
  14. struct node {
  15. node* nxt;
  16. ull H; int v;
  17. node(){}
  18. node(node* _,ull __) :
  19. nxt(_),H(__),v() {}
  20. }*head[N],mempool[N],*C=mempool;
  21. int vis[N],kase;
  22. void init() {
  23. kase++; C=mempool;
  24. }
  25. int& insert(ull st) {
  26. int pos=st%;
  27. if(vis[pos]!=kase) {
  28. vis[pos]=kase; head[pos]=0x0;
  29. }
  30. for(node* p=head[pos];p;p=p->nxt)
  31. if(p->H==st) return p->v;
  32. head[pos]=new (C++) node(head[pos],st);
  33. return head[pos]->v;
  34. }
  35. }
  36.  
  37. int n,K,a[N][],C[][];
  38.  
  39. ll calc(int st)
  40. {
  41. using namespace Hash_set;
  42. ll ans=;
  43. init();
  44. for(int i=;i<n;i++) {
  45. ull hash=;
  46. for(int j=;j<;j++)
  47. if( st&(<<j) )
  48. hash=(hash*B+a[i][j]);
  49. int& val=insert(hash);
  50. ans+=(val++);
  51. }
  52. return ans;
  53. }
  54.  
  55. void get_C()
  56. {
  57. for(int i=;i<=;i++) {
  58. C[i][]=C[i][i]=;
  59. for(int j=;j<i;j++)
  60. C[i][j]=C[i-][j-]+C[i-][j];
  61. }
  62. }
  63.  
  64. void read(int& x) {
  65. char c=getchar(); int f=; x=;
  66. while(!isdigit(c)){if(c=='-')f=-; c=getchar();}
  67. while(isdigit(c)) x=x*+c-'',c=getchar();
  68. }
  69.  
  70. int main()
  71. {
  72. get_C();
  73. read(n),read(K);
  74. for(int i=;i<n;i++)
  75. for(int j=;j<;j++) read(a[i][j]);
  76. ll ans=;
  77. for(int i=;i<;i++) {
  78. int cnt=;
  79. for(int j=;j<;j++)
  80. if(i&(<<j)) cnt++;
  81. if(cnt>=K) ans+=((cnt-K)&?-:)*calc(i)*C[cnt][K];
  82. }
  83. printf("%lld",ans);
  84. return ;
  85. }

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

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

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

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

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

  3. BZOJ 3198 SDOI2013 spring

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

  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 3197 [Sdoi2013]assassin(Hash+DP+KM)

    Description Input Output Sample Input 4 1 2 2 3 3 4 0 0 1 1 1 0 0 0 Sample Output 1 HINT [思路] Hash,D ...

  6. sdoi2013 spring(hash+容斥)

    大体思路是先求出来\(f[i]\)代表有至少\(i\)个位置相同的点对数. 然后就已经没什么好害怕的了(跟BZOJ3622一样) 然后这个\(f[i\)]怎么求呢? 最无脑的方法就是枚举位置,然后\( ...

  7. bzoj3198[Sdoi2013]spring 容斥+hash

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

  8. [Sdoi2013] [bzoj 3198] spring (hash+容斥原理)

    题目描述 给出nnn个666维坐标,求有多少对点对满足恰好mmm个位置相等 1<=n<=1051<=n<=10^51<=n<=105 0<=k<=60& ...

  9. BZOJ3198 [Sdoi2013]spring 哈希 容斥原理

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3198 题意概括 有n(1<=n<=100000)组数据,每组数据6个数. 现在问有几对 ...

随机推荐

  1. redis 在windows 上的安装与使用

    1.redis-windows 最近在做一个抢拍模块,由于过于平凡的insert与update I/O受不了,故只好把东西放内存里,等拍卖结束了,在写入磁盘. 至于为什么要用window呢? 因为服务 ...

  2. c++ 链接

    header.h #ifndef HEADER_H #define HEADER_H unsigned long getFac(unsigned short num); ; #endif // HEA ...

  3. Matlab中添加搜索目录

    一.问题来源 来自于一份大规模hash图像检索代码. 二.问题解析 2.1 添加目录 addpath('./utils/'); 2.2 添加目录及其子目录 addpath(genpath('./uti ...

  4. [转载]html5直接在网页上播放视频音频兼容所有浏览器

    文章给大家分享一个html5直接在网页上播放视频兼容所有浏览器,有需要的同学可参考. HTML5可以用video标签来播放视频 当前,video 元素支持三种视频格式: 格式 IE Firefox O ...

  5. 团体程序设计天梯赛-练习集L2-008. 最长对称子串

    L2-008. 最长对称子串 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 对给定的字符串,本题要求你输出最长对称子串的长度. ...

  6. LDPY Ghost Win7 64位 纯净自选版 V5.0

    ★ 概述: ☆ 源安装盘是[Windows7_SP1_ULTIMATE]微软官方SP1正式版. ☆ 破解激活WIN7,补丁更新至2013/06/18所有系统安全关键补丁. ☆ 破解 Windows 7 ...

  7. 5.查找最小的k个元素(数组)

    题目: 输入n个整数,输出其中最小的k个,例如输入1,2,3,4,5,6,7,8这8个数,则最小的4个是1,2,3,4(输出不要求有序) 解: 利用快速排序的partition,算导上求第k大数的思想 ...

  8. 【BZOJ 1185】 凸包+旋转卡壳

    Description [分析] 打计算几何真的可以哭出来... 跟那个求线段最远点差不多,这题弄三个东西转一转,一个表示左端最远点,一个表示右端最远点,一个表示上面最远点. 左右两边的最远点用点积判 ...

  9. Servlet课程0424(二) 通过继承GenericServlet来开发Servlet

    //这是第二种开发servlet的方法(继承GernericServlet) package com.tsinghua; import javax.servlet.GenericServlet; im ...

  10. Qt之QtSoap(访问WebService)

    http://blog.csdn.net/u011012932/article/details/51673800