3198: [Sdoi2013]spring

题意:n个物品6个属性,求有多少不同的年份i,j满足有k个属性对应相等


一开始读错题了,注意是对应相等 第i个属性只能和第i个属性对应

容斥一下

\[恰好k个相等=\ge k个相等 \ -\ \ge k+1个相等\ +\ \ge k+2个相等 \ ...
\]

\(2^6\)枚举哪些属性对应相等,哈希一下计算这些属性相等的个数,这时候其他是任意的因为是\(\ge\)

这样还不行,容斥系数还要乘上\(\binom{i}{k}\),因为两个k+1个属性对应相等的物品贡献了\(\binom{k+1}{k}\)个k个属性相等

其实就是说,比如\(\ge k\)的时候我们求到的\(\ge k\)个相等的方案数,并不是这样的物品对个数,对于一个\(k+i\)个属性对应相等的物品对我们其实考虑了\(\binom{k+i}{k}\)次,这里本身就出现了重复(不是容斥的原因是我们统计个数的原因),所以要额外消去这个的影响,方法就是乘上那个组合数

我在这里进行了证明




属性值太大很容易冲突所以要用哈希表

然后去学了哈希表...貌似P越小越快啊



```cpp
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N=1e5+5, M=23333, P=1001001;//1234567;
inline int read(){
char c=getchar();int x=0,f=1;
while(c'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&cint n, k, a[N][7], c[7][7];

struct HashList{

struct meow{int id, c, ne;} e[N*64];

int cnt, h[P], tim[P], Cl;

inline void ini(){Cl++;}

inline bool same(int x, int y, int s) {

for(int i=1; i<=6; i++)

if(s&(1<<(i-1)) && a[x][i] != a[y][i]) return false;

return true;

}

int hash(int a, int s) {

ll val=0;

for(int j=1; j<=6; j++)

if(s&(1<<(j-1))) val = (val
M%P + a[j]%P)%P;

return val;

}

int insert(int id, int s) {

int val=hash(a[id], s); //printf("ins %d %d %d\n",id,s,val);

if(tim[val] != Cl) h[val]=0, tim[val]=Cl;

for(int i=h[val];i;i=e[i].ne)

if(same(e[i].id, id, s)) {e[i].c++; return e[i].c-1;}

e[++cnt]=(meow){id, 1, h[val]}; h[val]=cnt;

return 0;

}

}H;

ll cal(int s) {

H.ini();

ll ans=0;

for(int i=1; i<=n; i++)

ans += H.insert(i, s);

return ans;

}

inline int one(int x) {

int ans=0;

while(x) ans++, x&=x-1;

return ans;

}

ll cnt[7];

int main() {

//freopen("in","r",stdin);

n=read(); k=read();

for(int i=1; i<=n; i++)

for(int j=1; j<=6; j++) a[i][j]=read();

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] + c[i-1][j-1];

}

int All=1<<6;

for(int s=0; s<All; s++) cnt[one(s)] += cal(s);

ll ans=0;

for(int i=k; i<=6; i++) ans += (( (i-k)&1 ) ? -1 : 1) * c[i][k] * cnt[i];

printf("%lld\n",ans);

}

BZOJ 3198: [Sdoi2013]spring [容斥原理 哈希表]的更多相关文章

  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

    为什么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. bzoj3198[Sdoi2013]spring 容斥+hash

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

  6. bzoj 2761 [JLOI2011]不重复数字(哈希表)

    2761: [JLOI2011]不重复数字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3210  Solved: 1186[Submit][Sta ...

  7. 数据结构 哈希表(Hash Table)_哈希概述

    哈希表支持一种最有效的检索方法:散列. 从根来上说,一个哈希表包含一个数组,通过特殊的索引值(键)来访问数组中的元素. 哈希表的主要思想是通过一个哈希函数,在所有可能的键与槽位之间建立一张映射表.哈希 ...

  8. redisTemplate写哈希表遇到的坑

    本文系原创,如有转载,请注明出处 在使用spring的redisTemplate进行redis哈希表的相关操作时,遇到了下面比较奇怪的情况: 1.删掉哈希表所属的key之后,重新get这个key的值, ...

  9. [PHP内核探索]PHP中的哈希表

    在PHP内核中,其中一个很重要的数据结构就是HashTable.我们常用的数组,在内核中就是用HashTable来实现.那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据 ...

随机推荐

  1. 跟我一起读postgresql源码(十二)——Executor(查询执行模块之——Materialization节点(下))

    接前文,我们继续说剩下的4个Materialization节点. 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT.INTERSECT两种集合操作,至于另一种集合操 ...

  2. centos7 hue安装

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

  3. Hibernate查询对象的方法浅析

    Hibernate 查询对象是根据对象的id查询的,只要你有id (id唯一),则无论你是否其他字段与传过来的对象一致,都会查到该id在数据库对应的对象.若是在关联查询中,所关联表的id为空,即所查表 ...

  4. js数组操作记录

    一 .splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. arrayObject.splice(index,howmany,item1,.....,itemX) 参数 描述 in ...

  5. Yourphp是一款完全开源免费的.核心采用了Thinkphp框架

    Yourphp企业网站管理系统,是一款完全开源免费的PHP+MYSQL系统.核心采用了Thinkphp框架,同时也作为开源软件发布.集众多开源项目于一身的特点,使本系统从安全,效率,易用及可扩展性上更 ...

  6. Asp.net mvc 中Action 方法的执行(二)

    [toc] 前面介绍了 Action 执行过程中的几个基本的组件,这里介绍 Action 方法的参数绑定. 数据来源 为 Action 方法提供参数绑定的原始数据来源于当前的 Http 请求,可能包含 ...

  7. Linux pmstat命令

      mpstat是linux一款实时系统监控工具.其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中.在多CPU系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU ...

  8. diffMerge安装配置使用

    概述: 在用git进行源代码版本维护的时候,常常会进行各代码版本之前区别的查看,例如在每次提交改动前进行git diff 可以看到源文件代码相对相应版本或是远程仓库的改动情况,如果有冲突还需要进行me ...

  9. java IO 类库的基本架构

    I/O问题是任何编程语言都无法回避的问题,可以说I/O问题是整个人机交互的核心问题,因为I/O是机器获取和交换信息的主要渠道,在当今这个数据大爆炸时代,I/O问题尤为突出,很容易成为一个性能瓶颈.正因 ...

  10. Not Found The requested URL / was not found on this server.

    http://www.wanysys.cc/coding/php/800.html 今天在做本地PHP项目的时候,想把之前wampserver的本地虚拟服务器环境访问方式改为本地localhost访问 ...