bzoj3198 spring hash&容斥原理
2016-03-29 16:48
399 查看
首先可以用容斥,这样就只用统计制定的i列相同的行的对数了(而不用恰好)。
那么可以把这几行对应的列抽出来,然后用hash值(不妨自然溢出)来统计,可以得到hash值相同的行的个数,然后一边更新一边统计答案即可。注意hash值很大需要用hash统计(此hash非彼hash)。
时间复杂度O(2^6*N)。
AC代码如下:
by lych
2016.3.29
那么可以把这几行对应的列抽出来,然后用hash值(不妨自然溢出)来统计,可以得到hash值相同的行的个数,然后一边更新一边统计答案即可。注意hash值很大需要用hash统计(此hash非彼hash)。
时间复杂度O(2^6*N)。
AC代码如下:
#include<iostream> #include<cstdio> #include<cstring> #define p 2150527 #define N 100005 #define ll long long using namespace std; int n,m,tot,a [6],fst[p],len ,nxt ,bin[15],vis[p],cbn[15][15]; ll pnt ; int read(){ int x=0; char ch=getchar(); while (ch<'0' || ch>'9') ch=getchar(); while (ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x; } ll solve(int x){ int i,j,k; ll tmp,ans=0; tot=0; for (i=1; i<=n; i++){ tmp=0; for (j=0; j<6; j++) if (x&bin[j]) tmp=tmp*1000003+a[i][j]; j=tmp%p; if (j<0) j+=p; if (vis[j]!=x){ vis[j]=x; fst[j]=0; } for (k=fst[j]; k; k=nxt[k]) if (pnt[k]==tmp){ ans+=len[k]; len[k]++; break; } if (!k){ pnt[++tot]=tmp; len[tot]=1; nxt[tot]=fst[j]; fst[j]=tot; } } return ans; } int main(){ n=read(); m=read(); int i,j; ll ans=0; for (i=1; i<=n; i++) for (j=0; j<6; j++) a[i][j]=read(); bin[0]=1; for (i=1; i<=6; i++) bin[i]=bin[i-1]<<1; cbn[0][0]=1; for (i=1; i<=6; i++) for (cbn[i][0]=1,j=1; j<=i; j++) cbn[i][j]=cbn[i-1][j]+cbn[i-1][j-1]; for (i=0; i<64; i++){ int cnt=0; for (j=0; j<6; j++) if (i&bin[j]) cnt++; if (cnt>=m){ ll tmp=solve(i)*cbn[cnt][m]; if ((cnt^m)&1) ans-=tmp; else ans+=tmp; } } printf("%lld\n",ans); return 0; }
by lych
2016.3.29
相关文章推荐
- java智力拼图小游戏
- java锁的种类以及辨析
- JDBC驱动自身问题引发的FullGC
- JAVA打印二维码图片自定义高度
- JavaEE_Servlet的页面跳转 和 参数的传递
- 2016.03.29///Java学习记录③
- 基于Springmvc的登录权限拦截器
- 2015届华为校园招聘机试题-本人菜鸟,尝试解答-工具Eclipse
- JVM——Java内存区域
- Java垃圾处理机制学习总结
- Spring MVC @Transactional注解方式事务失效的解决办法
- java List(泛型)和数组互转
- eclipse再见,android studio 新手入门教程(一)基本设置
- jvm学习笔记(一)—Java虚拟机内存区域
- JAVA 多线程随笔 (一) 可见性和volatile关键字
- Java提高之内存模型(待完成)
- Java提高之JVM(待完成)
- 关于Android 混淆的内容总结(studio和eclipse)
- java提高之util.concurrent(待完成)
- Java - Elasticsearch查询类型