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

    struct Tree() { int val; Tree *left, *right; Tree(int a): val(a), left(NULL), right(NULL){} } bool h ...

  2. 工控主板对ISO7816智能卡标准的支持

    ISO7816是一套协议标准,这套协议不仅规定了智能IC卡的机械电气特性,而且还规定了智能IC卡的应用方法.智能IC卡的主要用途可归为身份识别.支付安全.加密/解密和信息存储四个方面.智能IC卡已经广 ...

  3. 减少芯片失效:芯片焊接(die Attach)工艺优化

    在器件的生产过程中,芯片焊接是封装过程中的重点控制工序.此工艺的目的是将芯片通过融化的合金焊料粘结在引线框架上,使芯片的集电极与引线框架的散热片形成良好的欧姆接触和散热通路.由于固体表面的复杂性和粘结 ...

  4. java,C#接口与C++的虚基类

    看C#的接口感觉就像C++中继承并实现虚基类的函数方法一样,是OOP编程中表现多态的一种方式.可以参考下面的文章: http://blog.sina.com.cn/s/blog_60ff8f1b010 ...

  5. c#发送邮件样例

    1.通过gmail邮箱发送邮件 try { MailMessage mail = new MailMessage(); SmtpClient SmtpServer = new SmtpClient(& ...

  6. CSS flex让所有灵活的项目都带有相同的长度,忽略它们的内容:

    .flexbox {     display: -webkit-box;     display: -webkit-flex;     display: -ms-flexbox;     displa ...

  7. Java高级软件工程师面试考纲

    如果要应聘高级开发工程师职务,仅仅懂得Java的基础知识是远远不够的,还必须懂得常用数据结构.算法.网络.操作系统等知识.因此本文不会讲解具体的技术,笔者综合自己应聘各大公司的经历,整理了一份大公司对 ...

  8. poj 1328 Radar Installation(贪心)

    Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea i ...

  9. Firefox历史版本下载

    http://ftp.mozilla.org/pub/firefox/releases/ http://ftp.mozilla.org/pub/firefox/releases/47.0.1/

  10. C# 图结构操作

    仿造<<Java常用算法手册>>里面对的算法,使用C#实现了一遍. 理论知识我就不讲解了,在这本书里面已经写的非常完美! 代码如何下: using System; using ...