题意:
  题目给出两个整数n,k,(n<=10^18,k<=10^5),求一个含有k个整数的序列,要求以2为底,以序列内数字为幂的和为n,其中序列内最大的数最小,若有多个序列满足条件,输出字典序最大的一个。

样例:input :23 5 output:Yes  3 3 2 1 0  ,其中2^3+2^3+2^2+2^1+2^0=23=n

分析

两个点:1:2^n=2*2^n-1,也就是说答案序列中任何一个数x都可以变为两个x-1
           2: 结合二进制化十进制的方法,可以得到用2的幂次方表示的n

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
long long n;
int k;
map<int,int>b;
int main(){
cin>>n>>k;
int m=;
while(n){
b[m]=n&;
n/=;
if(b[m++])k--;
}
if(k<){
printf("No");
return ;
}
m--;
int i;
for(i=m;;i--){//使最大值最小
if(b[i]>k)break;
b[i-]+=*b[i];
k-=b[i];
b[i]=;
}
int j;
for(j=min(,i);j<=i;j++)if(b[j])break;
for(;;j--){
if(!k)break;
if(b[j]){
b[j]--;
b[j-]+=;
k--;}
}
printf("Yes\n");
for(int ll=m;ll>=j;ll--)
for(int l=;l<=b[ll];l++)printf("%d ",ll);
return ;
}

最新文章

  1. Cookie工具类
  2. phaser源码解析(二) Phaser.Utils类下pad方法
  3. tcp-backlog配置
  4. 编写一个程序, 将 a.txt 文件中的单词与 b.txt 文件中的 单词交替合并到 c.txt 文件中, a.txt 文件中的单词用回车符 分隔, b.txt 文件中用回车或空格进行分隔。
  5. SignalR 聊天室实例详解(服务器端推送版)
  6. 【Demo 0010】Java基础-泛型
  7. HDU 4643 GSM 简单计算几何
  8. Math 对象 识记
  9. SQL查询和删除重复字段的内容
  10. UNIX网络编程——基于UDP协议的网络程序
  11. 【spring实战第五版遇到的坑】第14章spring.cloud.config.uri和token配置项无效
  12. 以实例说明微服务拆分(以SpringCloud+Gradle)
  13. random模块、time模块、sys模块、os模块
  14. mac pfctl / centos iptables 使用
  15. 【DL】几种参数优化方法的比较
  16. IOS延时加载网络图片
  17. ASP.NET MVC使用AuthenticationAttribute验证登录
  18. 当Web访问性能出现问题,如何深探?
  19. Django之路 - 实现登录随机验证码
  20. selenium 结合 docker 构建分布式测试环境 (初学者视角)

热门文章

  1. matlab将矩阵写入文件
  2. JavaScript 中 this:
  3. 卷积神经网络实战-----0001(移植卷积神经网络c++ to python or java)
  4. [QT][问题]关于QT语言家使用失败的原因之一
  5. 【英语】Bingo口语笔记(84) - 惊讶的表达
  6. Cloudera Manager (centos)安装详细介绍
  7. vc++ windows 创建桌面快捷方式
  8. EasyWeChat微信开放平台第三方平台接入
  9. Does Windows have a limit of 2000 threads per process?
  10. 使用CMake生成sln项目和VS工程遇到的问题