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 单词分组(容斥)的更多相关文章

  1. BZOJ 4671 异或图 | 线性基 容斥 DFS

    题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...

  2. AcWing 214. Devu和鲜花 (容斥)打卡

    Devu有N个盒子,第i个盒子中有AiAi枝花. 同一个盒子内的花颜色相同,不同盒子内的花颜色不同. Devu要从这些盒子中选出M枝花组成一束,求共有多少种方案. 若两束花每种颜色的花的数量都相同,则 ...

  3. POJ1091跳蚤(容斥 + 唯一分解 + 快速幂)

      题意:规定每次跳的单位 a1, a2, a3 …… , an, M,次数可以为b1, b2, b3 …… bn, bn + 1, 正好表示往左,负号表示往右, 求能否调到左边一位,即 a1* b1 ...

  4. HDU 4059 容斥初步练习

    #include <iostream> #include <cstring> #include <cstdio> #include <algorithm> ...

  5. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  6. 【BZOJ-4455】小星星 容斥 + 树形DP

    4455: [Zjoi2016]小星星 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 204  Solved: 137[Submit][Status] ...

  7. cf#305 Mike and Foam(容斥)

    C. Mike and Foam time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. UVa12633 Super Rooks on Chessboard(容斥 + FFT)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/42145 Description Let’s assume there is a new chess ...

  9. PE-1 & 暴模|容斥

    题意: 求1000以下3或5的倍数之和. SOL: 暴模也是兹瓷的啊... 那么就想到了初赛悲催的滚粗...容斥忘了加上多减的数了... 然后对着题...T = 3*333*(1+333)/2 + 5 ...

随机推荐

  1. JavaScript中String对象处理HTML标记中文本的方法

    big():创建一个<big></big>标记,将这个字符串的字体变大blink():创建一个<blink></blink>标记,使字符串具有闪烁效果b ...

  2. 《iPhone高级编程—使用Mono Touch和.NET/C#》

    第1章 C#开发人员基于MonoTouch进行iPhone开发概述 1 1.1 产品对比 2 1.1.1 .NET Framework 2 1.1.2 Mono 2 1.1.3 MonoTouch 3 ...

  3. TaintDroid:智能手机监控实时隐私信息流跟踪系统(四)

    6      应用程序研究 款流行的应用程序是怎么使用用户敏感数据的.选取的应用程序可以根据相应的权限通过Internet获得各种各样的用户数据.我们研究发现三分之二的这些数据暴露了用户详细的地理位置 ...

  4. java常量设置的方式

    我们在写java程序的时候,常常有常量设置,如: public interface Const { //性别的常量 public interface Sex{ public final int 男=1 ...

  5. Android 通过外键连接两个数据库

    Learn: 1.Android数据库的语法. 2.通过外键连接两个数据库. 3.加强了对数据库的熟悉度. 4.对文本框的visiblity属性的了解. Demo:http://pan.baidu.c ...

  6. c语言结构体在内存中存储,字节对齐

    注意: 出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则: (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除: (2)结构体每个 ...

  7. MYSQL查询男女数量的存储过程

    存储过程代码: BEGIN IF sex_id =0 THEN SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.sex='女' INTO sex_co ...

  8. The secret of ROWID

    表里每个数据行都有一个行头部,在这里存放了该行数据所包含的列的数量,以及锁定标记等.当某个事务更新某条记录时,会在该数据行的头部记录所用到的ITL槽号以及锁定标记.接下来则是列长度以及列的值.Orac ...

  9. UGUI 全方位了解

    随着 unity3d 4.6 ~ 5.x + 新 UI 系统最终与大家见面了.这篇文章将不会介绍怎样使用button.滚动栏之类的UI控件.这些内容能够參考Unity Manual:这篇文章的重点是. ...

  10. 再看ADO对象模型

    在敲学生管理系统之前,我们就学习过ADO的有关知识.但是昨天被问到ADO的几个对象,顿时无言!为什么会出现这样的结果呢,明明是学习过了,而且也实践过(红皮书的五个例子).这充分说明了,在以往的学习过程 ...