CF-525E(E. Anya and Cubes) Meet-in-the-Middle
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相关推荐
- 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 ...
- Meet in the middle
搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...
- CF888E Maximum Subsequence (Meet in the middle,贪心)
题目链接 Solution Meet in the middle. 考虑到 \(2^{35}\) 枚举会超时,于是分成两半枚举(尽量平均). 然后不能 \(n^2\) 去匹配,需要用到一点贪心: 将数 ...
- 【搜索】【Meet in the middle】世界冰球锦标赛Ice Hockey World Championship
题目描述 译自 CEOI2015 Day2 T1「Ice Hockey World Championship」 今年的世界冰球锦标赛在捷克举行.Bobek 已经抵达布拉格,他不是任何团队的粉丝,也没有 ...
- 骑士精神(双向深搜+meet in the middle)
题目描述 在一个5×55×55×5的棋盘上有121212个白色的骑士和121212个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为111,纵坐标相差为22 ...
- E. XOR Guessing(Meet in the Middle)
E. XOR Guessing(Meet in the Middle) 先把14位折半一下. 先取100个 高7位都为0的数,就可以确定xxx的高7位, 然后取100个低7位都为0的数,就可以确定xx ...
- codeforces 297 E. Anya and Cubes
参考题解:http://blog.csdn.net/u014800748/article/details/44680613 题意: 给你n个cube,从里边最多选k个数,求选定的数中,求有多少数,或这 ...
- Solution:CF525E(Anya and Cubes)
题目链接 Link:CF525E 解题思路 折半搜索. 存下前半部分所有可能的和,在搜后半部分时尝试配对. 但是,由于 ! ! ! 的个数限制,我们要分出 k + 1 k+1 k+1 个存前半部分结果 ...
- CF888E Maximum Subsequence(meet in the middle)
给一个数列和m,在数列任选若干个数,使得他们的和对m取模后最大( \(1<=n<=35\) , \(1<=m<=10^{9}\)) 考虑把数列分成两份,两边分别暴力求出所有的可 ...
最新文章
- 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率
- Autodesk Infrastructure Map Server(AIMS)/MapGuide API 培训材料--第1章
- #39;git pull#39;和#39;git fetch#39;有什么区别?
- 使用eclipse 进行 Cesium 开发
- 十六、深入Python字符串
- row number函数_Hive排名函数ROW_NUMBER,RANK 和 DENSE_RANK的区别
- vijos1196|吃糖果游戏|博弈论
- 大文件打开工具 PilotEdit
- selenium中,运行测试用例,报NosuchElementException错误,用try --except 捕获异常
- 《学习OpenCV3》目录和全书划分
- 【转】解密微软的架构师之路
- gridview選發行彈出層 模板列
- centos7安装tomcat8
- PHPStrom 快捷键
- Magento清空购物车
- 微信小程序实现星星评分
- 脑图神器 XMind ZEN
- 美国总统拜登下令降半旗悼念枪击案遇难者
- 昆明理工大学c语言程序设计答案,昆明理工大学c语言程序设计课后习题答案
- 计算机储存数据怎样操作,计算机如何存储数据
热门文章
- 实验吧逆向catalyst-system——WP
- Codevs 1049 棋盘染色
- CUBRID学习笔记 31 通过select创建表
- 第二百三十一天 how can I 坚持
- ORA-12516:TNS:listener could not find available handler with matching protocol stack
- 中文Ubuntu主目录下的文档文件夹改回英文
- mysql accountlevel1_mysql---修改表结构
- java 信号量 countdown_Java计数器之CountDownLatch、CyclicBarrier、Semaphore
- 程序员之提升开发效率非常实用的十个工具网站分享
- 【数据结构与算法】之连通网络的操作次数的算法