http://codeforces.com/contest/1095/problem/C

题意:给n找出k个2的幂,加起来正好等于n。例如 9,4:9 = 1 + 2 + 2 + 4

思路:首先任何数都能表示成2的次幂的和,其次很容易发现,n和k都是二的次幂的情况是最基础的,因为可以分成k个n/k,而n/k一定是二的次幂。

所以,可以得出结论,只要n是2的次幂,且k<=n,一定有解。因为k一定能分成二的次幂的和。假如是 8,3就可以分成 4,1,、4,2这两种基础情况。

如果n不是2的次幂,那n也一定能分为,一个n以内最大的2的次幂加上另一个数,例如 36 = 32 + 4 、 63 = 32 + 31,由上可知,2的次幂是一定有解的,所以我们要给2的次幂尽量少分k,要给剩下的那个可能不是2的次幂的数多分k,好让那个数能够继续分成2的次幂和其他数的和。例如,63 = 32 + 31。32是一定有解得,31还要分成16 15 所以,要给31多分k。

 #include <iostream>
#include <vector> bool judge(int n){
if((n > ) && ((n & (n - )) == )) return ;
return ;
}
int find_near_power(int n){
long long m = ;
int cnt = ;
while(m <= n){
m = m * ;
cnt++;
}
return << (cnt - );
}
void dfs(int n, int k, std::vector<int> &res, int &ok){
if(n == && k == ) return;
else if((n > && k <= ) || (k <= && n > )) {
ok = ;
return ;
} if(n% == ){
k = k - ;
res.push_back();
dfs(n-, k, res, ok);
} else {
//std::cout << "n " << n << std::endl;
if(judge(n)){
if(judge(k)){
for(int i = ; i < k; ++i){
res.push_back(n/k);
}
} else {
int tmp = find_near_power(k);
dfs(n/, tmp, res, ok);
dfs(n/, k-tmp, res, ok);
//std::cout << "tmp " << tmp << std::endl;
}
} else {
int tmp = find_near_power(n);
//std::cout << "tmp " << tmp << std::endl;
if(n-tmp < k){
dfs(tmp, k+tmp-n, res, ok);
dfs(n-tmp, n-tmp, res, ok);
} else {
dfs(tmp, , res, ok);
dfs(n-tmp, k-, res, ok);
} }
}
}
int main()
{
int n, k;
while(std::cin >> n >> k){
if(n < k){
std::cout << "NO" << std::endl;
continue;
}
int ok = ;
std::vector<int> res;
dfs(n,k,res,ok);
if(ok == ){
std::cout << "YES" << std::endl;
for(int i = ; i < k; ++ i){
if(i == ) std::cout << res[i];
else std::cout << " " << res[i];
}
std::cout << std::endl;
} else {
std::cout << "NO" << std::endl;
}
}
}

Codeforces Round #529 (Div. 3) C. Powers Of Two的更多相关文章

  1. Codeforces Round #529 (Div. 3) C. Powers Of Two(数学????)

    传送门 题意: 给出一个整数 n ,问能否将 n 分解成 k 个数之和,且这 k 个数必须是2的幂. 如果可以,输出"YES",并打印出任意一组解,反之输出"NO&quo ...

  2. Codeforces Round #529 (Div. 3) C. Powers Of Two (二进制)

    题意:给你一个数\(n\),问是否能有\(k\)个\(2\)次方的数构成,若满足,输出一种合法的情况. 题解:从高到低枚举二进制的每一位,求出\(n\)的二进制的\(1\)的位置放进优先队列中,因为\ ...

  3. # Codeforces Round #529(Div.3)个人题解

    Codeforces Round #529(Div.3)个人题解 前言: 闲来无事补了前天的cf,想着最近刷题有点点怠惰,就直接一场cf一场cf的刷算了,以后的题解也都会以每场的形式写出来 A. Re ...

  4. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence (思维)

    Codeforces Round #529 (Div. 3) 题目传送门 题意: 给你由左右括号组成的字符串,问你有多少处括号翻转过来是合法的序列 思路: 这么考虑: 如果是左括号 1)整个序列左括号 ...

  5. CodeForces Round #529 Div.3

    http://codeforces.com/contest/1095 A. Repeating Cipher #include <bits/stdc++.h> using namespac ...

  6. Codeforces Round #529 (Div. 3) 题解

    生病康复中,心情很不好,下午回苏州. 刷了一套题散散心,Div 3,全部是 1 A,感觉比以前慢了好多好多啊. 这几天也整理了一下自己要做的事情,工作上要努力... ... 晚上还是要认认真真背英语的 ...

  7. Codeforces Round #529 (Div. 3) F.Make It Connected

    传送门 题意: 有 n 个顶点,每个顶点有个花费 a[ i ],连接顶点 u,v 需要花费 a[v]+a[u]的代价. 有 m 个特殊边,每条边有三个参数 u,v,w 代表的意思是连接 u,v 的花费 ...

  8. Codeforces Round #529 (Div. 3) D. Circular Dance

    传送门 题意: 有 n 个孩子编号为 1~n ,绕着圣诞树 dance: 编号为 i 的孩子可以记住ai1,ai2两个小孩,ai1,ai2是 i 在顺时针方向的相邻的两个小孩,但ai1,ai2不一定是 ...

  9. Codeforces Round #529 (Div. 3) E. Almost Regular Bracket Sequence(思维)

    传送门 题意: 给你一个只包含 '(' 和 ')' 的长度为 n 字符序列s: 给出一个操作:将第 i 个位置的字符反转('(' ')' 互换): 问有多少位置反转后,可以使得字符串 s 变为&quo ...

随机推荐

  1. C程序设计语言(K&R) 笔记2

    (1) #include <stdio.h> main(){ int c; while((c = getchar()) != EOF){ putchar(c); } } 注意,因为 != ...

  2. sharepoint 2013创建网站集,域帐户无法访问,只有administrator可以访问

    解决方法: 1.创建WEB应用程序时,可配置帐户必须为域帐户 2.确定关闭防火墙(这是重点) 我在测试时发现80端口和30714端口在其它同事的电脑上(域帐户)都可以访问,除这两个端口以后都无法访问, ...

  3. mybatis项目报错:java.sql.SQLException: ORA-00911: 无效字符 解决方法

    如果你用java写程序访问数据库,出现这个问题:java.sql.SQLException: ORA-00911: 无效字符 at oracle.jdbc.driver.DatabaseError.t ...

  4. 托盘在XP下不能显示tooltip,在Vista和Windows7下正常

    转自:http://blog.csdn.net/debehe/article/details/4294053 奇怪的问题,想了很多可能的理由,最终的答案竟然是一开始就被我否认了的一种可能!! 问题现象 ...

  5. MySQL数据库规范

    Mysql数据库规范 一.基础规范 [强制]使用InnoDB存储引擎解读:InnoDB存储引擎是MySQL默认存储引擎,支持事务和行级锁,并发性能更好,CPU及内存缓存页优化使得资源利用率更高[强制] ...

  6. c#循环语句 for 循环嵌套的练习。还有跳转语句,异常语句,迭代穷举介绍

    先说一下循环嵌套:循环嵌套就是再一个循环里面再放一个循环,也就是说如果没一个循环都循环10次,那么第一个循环是1的时候,嵌套的循环会循环十次.也就是10*10的效果. for 循环语句 主要还是逻辑思 ...

  7. matlab 修改文件夹下所有文件名大写为小写

    1. path = './DIR/';Files = dir(fullfile(path,'*.m'));LengthFiles = length(Files);for count_i = 1 : L ...

  8. ps和ai的一些认识

    ps主要是一个后期软件,它很大程度上不是一个创作型的软件,这是它的定位.我觉得李涛老师那句话说的很好,ps是对已有的素材进行加工的.这个已有的素材来源包括但不限于拍照.扫描.数绘板.下载的.如果说你想 ...

  9. Effective Objective-C [上]

    网上看到的 http://esoftmobile.com/2013/08/10/effective-objective-c/ 本文是针对<Effective Objective-C>一书的 ...

  10. 612D The Union of k-Segments

    传送门 题目大意 给定n个区间,问你被覆盖至少k次的区间(两端连续区间可以合并)最少有多少个,并输出. 分析 大水题呀QwQ,只需要将每个点的位置及它是左端点还是右端点这两个信息存起来然后进行一些简单 ...