CF-525E(E. Anya and Cubes) Meet-in-the-Middle

题目链接

题意

n(n≤25)n(n \le 25)n(n≤25)个数字 kkk次染色机会.选择一个数字并对它染色贡献为ai!a_i!ai​!,不对它染色贡献为aia_iai​;不选择这个数字贡献为0.求一共有多少种方案在染色不超过kkk次的前提下使得总的贡献为S(S≤1016)S(S \le10^{16})S(S≤1016)

思路

meet-in-the-middle

把n个数字分成两部分,每个dfs找三种状态复杂度为O(3n2)O(3^{\frac{n}{2}})O(32n​)

#include <bits/stdc++.h>
using namespace std;
int n, k;
long long S, ans;
map<long long, int> mp[26];
long long f[20], a[30];
void dfs1(int l, int r, int usek, long long sum) {if (usek > k || sum > S) return;if (l > r) {mp[usek][sum]++;return;}dfs1(l+1, r, usek, sum);dfs1(l+1, r, usek, sum+a[l]);if (a[l] < 20) dfs1(l+1, r, usek+1, sum+f[a[l]]);
}
void dfs2(int l, int r, int usek, long long sum) {if (usek > k || sum > S) return;if (l > r) {for (int i = 0; i + usek <= k; ++i) {if (mp[i].count(S-sum)) ans += mp[i][S-sum]; }return;}dfs2(l+1, r, usek, sum);dfs2(l+1, r, usek, sum+a[l]);if (a[l] < 20) dfs2(l+1, r, usek+1, sum+f[a[l]]);
}int main() {f[0] = 1;for (int i = 1; i < 20; ++i) f[i] = f[i-1] * i;scanf("%d %d %lld", &n, &k, &S);for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);int mid = (1+n) >> 1;ans = 0;dfs1(1, mid, 0, 0);dfs2(mid+1, n, 0, 0);printf("%lld\n", ans);return 0;
}

CF-525E(E. Anya and Cubes) Meet-in-the-Middle相关推荐

  1. Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索

    Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec  Memory Limit: 512 MB Submit: xxx  ...

  2. Meet in the middle

    搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...

  3. CF888E Maximum Subsequence (Meet in the middle,贪心)

    题目链接 Solution Meet in the middle. 考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均). 然后不能 \(n^2\) 去匹配,需要用到一点贪心: 将数 ...

  4. 【搜索】【Meet in the middle】世界冰球锦标赛Ice Hockey World Championship

    题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有 ...

  5. 骑士精神(双向深搜+meet in the middle)

    题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...

  6. E. XOR Guessing(Meet in the Middle)

    E. XOR Guessing(Meet in the Middle) 先把14位折半一下. 先取100个 高7位都为0的数,就可以确定xxx的高7位, 然后取100个低7位都为0的数,就可以确定xx ...

  7. codeforces 297 E. Anya and Cubes

    参考题解:http://blog.csdn.net/u014800748/article/details/44680613 题意: 给你n个cube,从里边最多选k个数,求选定的数中,求有多少数,或这 ...

  8. Solution:CF525E(Anya and Cubes)

    题目链接 Link:CF525E 解题思路 折半搜索. 存下前半部分所有可能的和,在搜后半部分时尝试配对. 但是,由于 ! ! ! 的个数限制,我们要分出 k + 1 k+1 k+1 个存前半部分结果 ...

  9. CF888E Maximum Subsequence(meet in the middle)

    给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...

最新文章

  1. 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率
  2. Autodesk Infrastructure Map Server(AIMS)/MapGuide API 培训材料--第1章
  3. #39;git pull#39;和#39;git fetch#39;有什么区别?
  4. 使用eclipse 进行 Cesium 开发
  5. 十六、深入Python字符串
  6. row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别
  7. vijos1196|吃糖果游戏|博弈论
  8. 大文件打开工具 PilotEdit
  9. selenium中,运行测试用例,报NosuchElementException错误,用try --except 捕获异常
  10. 《学习OpenCV3》目录和全书划分
  11. 【转】解密微软的架构师之路
  12. gridview選發行彈出層 模板列
  13. centos7安装tomcat8
  14. PHPStrom 快捷键
  15. Magento清空购物车
  16. 微信小程序实现星星评分
  17. 脑图神器 XMind ZEN
  18. 美国总统拜登下令降半旗悼念枪击案遇难者
  19. 昆明理工大学c语言程序设计答案,昆明理工大学c语言程序设计课后习题答案
  20. 计算机储存数据怎样操作,计算机如何存储数据

热门文章

  1. 实验吧逆向catalyst-system——WP
  2. Codevs 1049 棋盘染色
  3. CUBRID学习笔记 31 通过select创建表
  4. 第二百三十一天 how can I 坚持
  5. ORA-12516:TNS:listener could not find available handler with matching protocol stack
  6. 中文Ubuntu主目录下的文档文件夹改回英文
  7. mysql accountlevel1_mysql---修改表结构
  8. java 信号量 countdown_Java计数器之CountDownLatch、CyclicBarrier、Semaphore
  9. 程序员之提升开发效率非常实用的十个工具网站分享
  10. 【数据结构与算法】之连通网络的操作次数的算法