CoFun 1612 单词分组(容斥)
Description
Stan有N个不同的单词,这天,Stan新结交的两个朋友来他这里玩,Stan作为主人,他需要送给他们单词,但由于Stan不能偏心,所以Stan给每个单词一个权值v_i,他需要他这N个单词恰好分配给这两个朋友,这个地方的人很奇怪,他们用来定义自己的喜悦值的方式是把所有得到的单词的权值都位运算and起来的值,所以你需要使得两个朋友的喜悦值是相同的。
好学的Stan不满足于求出一种方案,而是想要知道总共有多少种方案数,Stan觉得这个太简单了,所以请你来帮他解决吧。
Input Format
第一行包含一个整数N
第二行包含N个非负整数,表示每个单词的权值
Output Format
输出仅一行,即方案数
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#define ll long long
ll f[][][][][],ans=;
int n,a[],mx,bin[];
int b[][],m,num,fa[];
int read(){
char ch=getchar();int t=,f=;
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void sbpianfen(){
for (int i=;i<=n;i++){
int now=i&,pre=now^;
if (i==){
f[now][a[i]][][][]=;
f[now][][a[i]][][]=;
continue;
}
for (int j=;j<=mx;j++) for (int k=;k<=mx;k++) for (int l=;l<=;l++) for (int z=;z<=;z++) f[now][j][k][l][z]=;
for (int j=;j<=mx;j++)
for (int k=;k<=mx;k++){
if (k==)
f[now][j&a[i]][k][][]+=f[pre][j][k][][];
f[now][j&a[i]][k][][]+=f[pre][j][k][][];
if (j==)
f[now][j][k&a[i]][][]+=f[pre][j][k][][];
f[now][j][k&a[i]][][]+=f[pre][j][k][][];
}
for (int j=;j<=mx;j++){
f[now][a[i]][j][][]+=f[pre][][j][][];
f[now][j][a[i]][][]+=f[pre][j][][][];
}
}
ans=;
for (int i=;i<=mx;i++)
ans+=f[n&][i][i][][];
printf("%lld\n",ans);
}
int find(int x){
if (fa[x]==x) return x;
else return (fa[x]=find(fa[x]));
}
void dfs(int dep,int delta){
if (dep==m){
ans+=(ll)delta*(((ll)<<num));
return;
}
dfs(dep+,delta);
int tnum=num;
int tmp[];
for (int j=;j<n;j++) tmp[j]=fa[j];
int T;
for (T=;!b[dep][T];T++);
int f=find(T);
for (int j=T+;j<n;j++)
if (b[dep][j]){
int xx=find(j);
if (xx!=f){
fa[xx]=f;
num--;
}
}
dfs(dep+,-delta);
for (int j=;j<n;j++)
fa[j]=tmp[j];
num=tnum;
}
void sxpianfen(){
m=;
for (int i=;i<;i++){
int t=<<i,cnt=;
for (int j=;j<n;j++)
if (a[j]&t) cnt++;
if (cnt==||cnt==n) continue;
for (int j=;j<n;j++)
if (!(a[j]&t)) b[m][j]=;
else b[m][j]=;
m++;
}
for (int i=;i<n;i++)
b[m][i]=,fa[i]=i;
m++;
ans=;
num=n;
dfs(,);
printf("%lld\n",ans);
}
int main(){
n=read();
for (int i=;i<n;i++) a[i]=read();
sxpianfen();
}
CoFun 1612 单词分组(容斥)的更多相关文章
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- AcWing 214. Devu和鲜花 (容斥)打卡
Devu有N个盒子,第i个盒子中有AiAi枝花. 同一个盒子内的花颜色相同,不同盒子内的花颜色不同. Devu要从这些盒子中选出M枝花组成一束,求共有多少种方案. 若两束花每种颜色的花的数量都相同,则 ...
- POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)
题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...
- HDU 4059 容斥初步练习
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
- 【BZOJ-4455】小星星 容斥 + 树形DP
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 204 Solved: 137[Submit][Status] ...
- cf#305 Mike and Foam(容斥)
C. Mike and Foam time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- UVa12633 Super Rooks on Chessboard(容斥 + FFT)
题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...
- PE-1 & 暴模|容斥
题意: 求1000以下3或5的倍数之和. SOL: 暴模也是兹瓷的啊... 那么就想到了初赛悲催的滚粗...容斥忘了加上多减的数了... 然后对着题...T = 3*333*(1+333)/2 + 5 ...
随机推荐
- 智能卡安全机制比较系列(六) TimeCOS
TimeCOS是握奇公司推出的智能卡操作系统,也可以说是国内早期自己开发的为数不多的几款COS之一.当然随着后来国内公司对于CPU卡开发的投入,其他公司的COS产品也纷纷推出. 其实从握奇的TimeC ...
- MFC消息映射与命令传递
题外话:刚开始学视窗程序设计的时候,我就打印了一本Windows消息详解,里面列举了各种已定义消息的意义和作用,共10多页,在编程的时候翻翻,有时觉得很受用.我发觉很多编程的朋友,虽然每天都面对消息, ...
- java,C#接口与C++的虚基类
看C#的接口感觉就像C++中继承并实现虚基类的函数方法一样,是OOP编程中表现多态的一种方式.可以参考下面的文章: http://blog.sina.com.cn/s/blog_60ff8f1b010 ...
- c++命名空间using
#include<iostream> namespace run1 { ; } namespace run2 { ; void show() { std::cout << x ...
- jQuery获取select option
jQuery的一些方法理出一些常用的方法: //获取第一个option的值 $('#test option:first').val(); //最后一个option的值 $('#test option: ...
- mysql语句添加索引
1.PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2. ...
- swift 随机数
1.一行代码生成随机数 arc4random() 如果要生成一个生成在一定范围内的随机整数: func randomIn(#min: Int, max: Int) -> Int { retur ...
- iOS UIView显示颜色渐变
-(void)colorWear:(UIView *)view{ CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame ...
- CentOS系统、Jdk、Tomcat安装实战
CentOS系统.Jdk.Tomcat安装实战 第一次接触Liunx系统,都说J2EE系统在Li ...
- Android 按二次后退键退出应用程序
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...