欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ3198


题意概括

  有n(1<=n<=100000)组数据,每组数据6个数。

  现在问有几对数据,满足其数字相同的个数恰好为k。

  0<=k<=6


题解

  首先暴搜是不行的。

  然后我们发现可以哈希+容斥。

  对于有至少有x个数字相同的情况,我们可以枚举+hash解决(这个很简单,不用说了吧)。

  然后是最关键的。

  假设ans[i]表示至少有i个相同的情况总数。

  那么会有重复:

  比如某4个数相同,那么在其相应的ans[3]中,有一部分值是这4个数的排列。

  比如某两组数据的第1,2,3,4个数字相等,那么对于1,2,3相等,1,2,4相等,1,3,4相等,2,3,4相等都算了一遍,所以ans[3]要减掉ans[4]*C(4,3)

  那么同理,所有的从大到小减一减,然后就得出了答案。


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
typedef long long LL;
const int N=100005;
LL MOD=1000000007,MOD2=998244353,Ti=23333,Ti2=65119;
int n,k;
LL a[N][6],ans[6],C[10][10],v[N],v2[N];
int cnt1(int x){
int ans=0;
while (x)
ans+=x&1,x>>=1;
return ans;
}
LL solve(int k){
LL ans=0;
for (int i=0;i<(1<<6);i++){
if (cnt1(i)!=k)
continue;
for (int j=1;j<=n;j++){
v[j]=v2[j]=0;
for (int k=0;k<6;k++)
if (i&(1<<k))
v[j]=(v[j]*Ti+a[j][k])%MOD,v2[j]=(v2[j]*Ti2+a[j][k])%MOD2;
v[j]+=v2[j]*2033333333;
}
sort(v+1,v+n+1);
v[n+1]=v[n]+1;
int prev=1;
for (int j=2;j<=n+1;j++)
if (v[j]!=v[j-1])
ans+=1LL*(j-prev)*(j-prev-1)/2,prev=j;
}
return ans;
}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++)
for (int j=0;j<6;j++)
scanf("%lld",&a[i][j]);
for (int i=0;i<=6;i++)
ans[i]=solve(i);
memset(C,0,sizeof C);
for (int i=0;i<=6;i++)
C[i][0]=1;
for (int i=1;i<=6;i++)
for (int j=1;j<=i;j++)
C[i][j]=C[i-1][j]+C[i-1][j-1];
for (int i=6;i>=1;i--)
for (int j=0;j<i;j++)
ans[j]-=ans[i]*C[i][j];
printf("%lld\n",ans[k]);
return 0;
}

  

BZOJ3198 [Sdoi2013]spring 哈希 容斥原理的更多相关文章

  1. bzoj3198[Sdoi2013]spring 容斥+hash

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

  2. BZOJ3198[SDOI2013]SPRING

    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_3129_[Sdoi2013]方程_组合数学+容斥原理

    BZOJ_3129_[Sdoi2013]方程_组合数学+容斥原理 Description 给定方程     X1+X2+. +Xn=M 我们对第l..N1个变量进行一些限制: Xl < = A ...

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

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

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

  7. BZOJ 3198 SDOI2013 spring

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

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

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

  9. [SDOI2013]spring

    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 容 ...

随机推荐

  1. sql 把多列内容合并

    这个语句不完整.应该是这样:stuff(select ',' + fieldname  from tablename for xml path('')),1,1,'') as ’别名‘这一整句的作用是 ...

  2. python技巧 计算字符串中字母出现的次数并取出最大

    有一个字符串 “aaddfdfdercfghfyttefsfsfewretr123trefg5624sdfcgvfdgte6435234532”,现在需要取出里面出现次数最多的字符 第一种方法-装饰器 ...

  3. 2017CCPC秦皇岛 E题String of CCPC&&ZOJ3985【模拟】

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3985 题意: 给定一个字符串,由c和p组成,可以添加c或者p. 串中出现一 ...

  4. 第19月第8天 斯坦福大学公开课机器学习 (吴恩达 Andrew Ng)

    1.斯坦福大学公开课机器学习 (吴恩达 Andrew Ng) http://open.163.com/special/opencourse/machinelearning.html 笔记 http:/ ...

  5. 3、输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

    题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 利用栈“先进后出”的性质,将链表的值存入到栈里,然后将栈里的值存入到构建好的容器里,最后打印容器. class So ...

  6. img格式镜像转ISO格式

    在做汇编学习时,需要用比较老的Windows XP来进行调试学习,因此找了最老的Windows XP(CN_WINXP_PRO_ISO,无SP版本 ),下载后发现镜像文件格式是img的,而virtua ...

  7. Bootstrap模态框(一个页面显示多个)的使用

    在一个页面显示多个模态框时要讲每个模态框用div包裹起来,否咋会产生格式错误. <html> <head> <meta charset="utf-8" ...

  8. 使用Idea初始化SpringMvc项目

    (1) (2) (3) (4) (5)感谢http://www.cnblogs.com/feiyujun/p/6537510.html (6)

  9. ll(ls -l) 列属性

    文件属性 文件数 拥有者 所属的group 文件大小 建档日期 文件名 drwx------ 2 Guest users 1024 Nov 21 21:05 Mail

  10. __ATTRIBUTE__ 知多少?

    GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属性(Function Attribute ).变量属性(Variable Attribute )和 ...