【Henu ACM Round#18 E】Anya and Cubes
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
每个数字有3种选择。
1.选中它。
2.选中它且加阶乘符号
3.不选中它(即计算和的时候不考虑它)
如果我们直接暴力写的话复杂度是\(3^{25}\)
寻求优化。
我们可以用Meet-in-the-middle这个方法。
先求出1..n/2这些数字的组合方式。
用map<ll,ll> dic[25]来存它们的和。
dic[i][j]表示前n/2个数字中选了i个【2】状态的数字,和为j的方案数。
则我们再穷举n/2+1..n这些数字的选择情况。
得到了和sum以及【2】状态的数字个数cnt之后。
答案累加\(∑_0^{k-cnt}dic[i][m-sum]\)
这样复杂度就是\(O(3^{12})\)级别的了。
完全可以接受了
(n=1的时候,n/2等于0,如果你的dfs里面写的条件是now==n/2,应该把它改为now>=n/2,如果不这么改的话,dic[0][0]=1这个会漏掉,
然后右半边就可能会漏解了)
【代码】
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6;
const int M = 25;
const int MM = 200e4;
int n,k,a[M+10],bo[M+10],tt;
ll pre[M+10],m,ans;
vector<ll>b[M+1];
int get_num(int cnt,ll x){
int l = 0,r = b[cnt].size()-1,temp1=-1,temp2=-1;
while (l <= r){
int mid = (l+r)>>1;
if (x<=b[cnt][mid]){
temp1 = mid;
r = mid-1;
}else l = mid+1;
}
l = 0,r = b[cnt].size()-1;
while (l <= r){
int mid = (l+r)>>1;
if (x>=b[cnt][mid]){
temp2 = mid;
l = mid+1;
}else r = mid-1;
}
if (temp1==-1 || temp2 ==-1 || b[cnt][temp1]!=x) return 0;
else return temp2-temp1+1;
}
void dfs(int now,int ope){
int st,en;
if (ope==1)
st = 1,en = n/2;
else
st = n/2+1,en = n;
if (now>=en+1){
ll sum = 0;
int cnt = 0;
for (int i = st;i <= en;i++){
if (bo[i]==0) continue;
if (bo[i]==2){
if (a[i]>=19) return;
sum+=pre[a[i]];
cnt++;
}else sum+=a[i];
}
if (sum > m) return;
if (ope==1){
b[cnt].push_back(sum);
}else{
for (int i = 0;i <= k-cnt;i++) {
ans+=get_num(i,m-sum);
}
}
return;
}
bo[now] = 0;
dfs(now+1,ope);
bo[now] = 1;
dfs(now+1,ope);
bo[now] = 2;
dfs(now+1,ope);
}
int main()
{
#ifdef LOCAL_DEFINE
freopen("rush_in.txt","r",stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
pre[0] = 1;
for (int i = 1; ;i++){
pre[i] = pre[i-1]*i;
if (pre[i]>1e16+10) break;
}
cin >> n >> k >> m;
for (int i = 1;i <= n;i++) cin >> a[i];
dfs(1,1);
for (int i = 0;i <= k;i++) sort(b[i].begin(),b[i].end());
dfs(n/2+1,2);
cout<<ans<<endl;
return 0;
}
【Henu ACM Round#18 E】Anya and Cubes的更多相关文章
- 【Henu ACM Round#18 F】Arthur and Walls
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 考虑,为什么一个连通块里面的空格没有变成一个矩形? 如果不是形成矩形的话. 肯定是因为某个2x2的单张方形里面. 只有一个角是墙.其 ...
- 【Henu ACM Round#18 D】Looksery Party
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 假设现在每个人收到的信息条数存在cnt里面 那个人猜的条数为target 则如果cnt[i]==target[i] 则我们就让第i个 ...
- 【Henu ACM Round#18 C】Ilya and Sticks
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用cnt[i]记录数字i出现的次数就好. 然后i从1e6逆序到1 如果cnt[i+1]和cnt[i]>0同时成立的话. 那么得 ...
- 【Henu ACM Round#18 B】Modulo Sum
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] m比较小 <=1000 a[i]直接看成a[i]%m就可以了. 有n个0..999之间的整数.. 如果有一个0那么就直接输出Y ...
- 【Henu ACM Round#18 A】 Multiplication Table
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 遍历i从1..n 看看x%i==0以及x/i<=n是否成立. [代码] #include <iostream> u ...
- 【Henu ACM Round#24 D】Iterated Linear Function
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 把B提取出来就是一个等比数列了. 求和一下会发现是这种形式. \(B*\frac{(A^n-1)}{A-1}+A^n*x\) 则求一 ...
- 【Henu ACM Round#17 D】Hexagons!
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 题目的图吓人. 找下规律就会发现从内到外是1,6,12,18 即1,16,26,36... 即1+6(1+2+3+...) 等差求和 ...
- 【Henu ACM Round#14 D】Kefa and Dishes
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 状态压缩动规. 可以写成记忆化搜索的形式. f[bit][p] 表示选取的菜的情况为bit(用0..2^(N)-1的二进制形式表示各 ...
- 【Henu ACM Round#24 E】Connected Components
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 要求把连续的一段li..ri的边全都删掉. 然后求剩下的图的联通数 如果暴力的话 复杂度显然是O(k*m)级别的. 考虑我们把li. ...
随机推荐
- zookeeper应用场景练习(分布式锁)
在寻常的高并发的程序中.为了保证数据的一致性.因此都会用到锁.来对当前的线程进行锁定.在单机操作中.非常好做到,比方能够採用Synchronized.Lock或者其它的读写多来锁定当前的线程.可是在分 ...
- hdu4089Activation 概率dp
//一条队列对于第一个人的情况 //概率p1:队列保持不变 //p2:第一个人到队尾 //p3:第一个人出队 //p4:系统崩溃 //队列中有N个人,Tomato 在第M位置,求系统崩溃.Tomato ...
- Java transientkeyword使用小记
1. transient的作用及用法 我们都知道一个对象仅仅要实现了Serilizable接口,这个对象就能够被序列化,java的这样的序列化模式为开发人员提供了非常多便利.我们能够不必关系详细序列化 ...
- iOS自动布局高级用法 && 纯代码约束写法
本文主要介绍几个我遇到的总结的高级用法(当然我相信肯定有不少比这还高级的). 简单的storyboard中上下左右约束,固定宽高啥的用法在这里就不做赘述了. autolayout自动布局是iOS6以后 ...
- spark groupByKey 也是可以filter的
>>> v=sc.parallelize(["one", "two", "two", "three", ...
- 安卓开发--scrollview
package com.cnn.scrollviewdemo01; import android.R.integer; import android.annotation.SuppressLint; ...
- nil gogo
https://blog.csdn.net/zhonggaorong/article/details/50233421 https://github.com/KevinHM/FunctionalRea ...
- Python3基础笔记--生成器
目录: 一.列表生成器 二.生成器 三.迭代器 一.列表生成器 a = [x for x in range(10)] b= [y*2 for y in range(10)] def f(n) retu ...
- 洛谷2850 【Usaco2006 Dec】虫洞Wormholes SPFA
问题描述 John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N (从1..N ...
- POJ-2785 Values whose Sum is 0 Hash表
题目链接:https://cn.vjudge.net/problem/POJ-2785 题意 给出四组数,每组有n个数 现从每组数中取一个数作为a,b,c,d 问有几组这样的a+b+c+d=0 思路 ...