[题目描述]

给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数。

[输入文件]

第一行 n 个正整数

以下有 n行,每行1个

正整数表示整数序列a

[输出文件]

一个整数表示答案

[输入样例]

4

1 2 3 4

[输出样例]

3

[数据范围]

30%:n<=5

100%:n<=20

100%:a 中每个元素<=100000000

题解:

对于前半部分和后半部分dfs枚举

将前半部分得到的值包括状态存进hash(去重),在把后半部分的所有状态去重在hash中查找

本来是用的三进制数表示存进子集A,存进子集B,删去3种状态,后面发现没有必要

因为是“删数的方案”,也就是除删去的数,AB集合间如何分配并不关心,所以直接二进制就行

注意hash不能只存值,还要保存二进制数以判重,保存二进制数的数组不能太小也不能大

hash的大小70000够了,状态数组zt[70000][700]正好AC,500则90分,100则75分

博客里上传了数据,在管理里的文件

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
long long s;
int p;
}f[];
int n,zt[][],len,h[];
long long ans,has[],sp[],inf,a[];
bool cmp(Node a,Node b)
{
return (a.s<b.s||(a.s==b.s&&a.p<b.p));
}
void push_hash(long long x,int i)
{int j;
long long p=(x+)%;
while (has[p]!=inf&&has[p]!=x)
{
p++;
if (p>) p=;
}
if (has[p]==inf)
{
has[p]=x;
sp[p]=;
zt[p][sp[p]]=i;
}
else if (has[p]==x)
{
for (j=;j<=sp[p];j++)
if (i==zt[p][j]) return;
sp[p]++;
zt[p][sp[p]]=i;
}
}
void ask_hash(long long x,int i)
{int j;
long long p=(x+)%;
while (has[p]!=inf&&has[p]!=x)
{
p++;
if (p>) p=;
}
if (has[p]==x)
{
for (j=;j<=sp[p];j++)
h[zt[p][j]|i]=;
}
}
void dfs1(int x,long long s,int p)
{int i;
if (x>n/) push_hash(s,p);
else
for (i=-;i<=;i++)
dfs1(x+,s+i*a[x],p|((i!=)<<(x-)));
}
void dfs2(int x,long long s,int p)
{int i;
if (x>n) f[++len]=(Node){s,p};
else
for (i=-;i<=;i++)
dfs2(x+,s+i*a[x],p|((i!=)<<(x-)));
}
int main()
{int i,j;
long long s;
freopen("regex.in","r",stdin);
freopen("regex.out","w",stdout);
cin>>n;
memset(has,-,sizeof(has));
inf=has[];
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
dfs1(,,);dfs2(n/+,,);
sort(f+,f+len+,cmp);
for (i=;i<len;i++)
if (f[i].s==f[i+].s&&f[i].p==f[i+].p) f[i].s=(<<);
sort(f+,f+len+,cmp);
while (f[len].s==(<<)) len--;
for (i=;i<=len;i++)
ask_hash(-f[i].s,f[i].p);
for (i=;i<=(<<n)-;i++) ans+=h[i];
//cout<<h[i]<<endl;
cout<<ans;
}

删数方案数(regex)的更多相关文章

  1. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  2. Codeforces 461B. Appleman and Tree[树形DP 方案数]

    B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  3. NOIP2012pj摆花[DP 多重背包方案数]

    题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...

  4. UVa 11137 (完全背包方案数) Ingenuous Cubrency

    题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...

  5. poj2975 Nim 胜利的方案数

    Nim Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5545   Accepted: 2597 Description N ...

  6. ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」

    传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...

  7. P2347 砝码称重-DP方案数-bitset

    P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...

  8. [HAOI2017]方案数[组合计数、容斥、dp]

    题意 题目链接 分析 先考虑没有障碍怎么做,定义 f(i,j,k) 每一维走了 i,j,k 位的方案数,转移乘个组合数即可. 现在多了一些障碍,考虑容斥.实际我们走过的点都有严格的大小关系,所以先把所 ...

  9. hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)

    n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ...

随机推荐

  1. sql with as 用法-Z

    以下内容转自:http:.com/ 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个 ...

  2. 项目Beta冲刺预热

    Beta准备 1. 讨论组长是否重选的议题和结论. 经过讨论,我们认为,经过一段时间的磨合,现任组长是不需要更换的. 2. 下一阶段需要改进完善的功能. 增加关于征信的功能,贴近选题主题 美化界面,尽 ...

  3. Django 博客

    blogproject/blogproject/settings.py ## 其它配置代码... # 把英文改为中文 LANGUAGE_CODE = 'zh-hans' # 把国际时区改为中国时区 T ...

  4. Python 迭代器之列表解析

     [TOC] 尽管while和for循环能够执行大多数重复性任务, 但是由于序列的迭代需求如此常见和广泛, 以至于Python提供了额外的工具以使其更简单和高效. 迭代器在Python中是以C语言的 ...

  5. windows 10下通过python3.6成功搭建jupyter 服务器

    最近通过python学习爬虫技术,发现一个工具jupyter notebook很不错,该工具明显优势通过浏览器可以输入多行python代码,支持在线运行以及运行结果保存功能,在线验证python小模块 ...

  6. 深入了解GOT,PLT和动态链接

    之前几篇介绍exploit的文章, 有提到return-to-plt的技术. 当时只简单介绍了 GOT和PLT表的基本作用和他们之间的关系, 所以今天就来详细分析下其具体的工作过程. 本文所用的依然是 ...

  7. python入门(4)第一个python程序

    python入门(4)第一个python程序 在交互式环境的提示符>>>下,直接输入代码,按回车,就可以立刻得到代码执行结果.现在,试试输入100+200,看看计算结果是不是300: ...

  8. ssh整合之四单独搭建struts的运行环境

    1.导入struts的基本jar包 2.在web.xml中配置我们struts的核心控制器StrutsPrepareAndExecuteFilter <?xml version="1. ...

  9. *args和**kwargs

    #coding=utf8 __author__ = 'Administrator' # 当函数的参数不确定时,可以使用*args和**kwargs.*args没有key值,**kwargs有key值 ...

  10. Zookeeper通过java创建、查看、修改、删除znode

    本章主要介绍zookeeper如何使用,其实通过zkCli.cmd我们是可以执行一些操作的:声明:参考及转自<http://www.blogjava.net/BucketLi/archive/2 ...