CF 1095C Powers Of Two(二进制拆分)
A positive integer xx is called a power of two if it can be represented as x=2y, where y is a non-negative integer. So, the powers of two are 1,2,4,8,16,…
You are given two positive integers nn and k. Your task is to represent nn as the sumof exactly k powers of two.
Input
The only line of the input contains two integers nn and k (1≤n≤109, 1≤k≤2⋅105).
Output
If it is impossible to represent nn as the sum of k powers of two, print NO.
Otherwise, print YES, and then print kk positive integers b1,b2,…,bk such that each of bibi is a power of two, and ∑i=1kbi=n. If there are multiple answers, you may print any of them.
Examples
Input
9 4
Output
YES
1 2 2 4
Input
8 1
Output
YES
8
Input
5 1
Output
NO
Input
3 7
Output
NO
题目意思:给定一个数,让你用1,2,4,8等2的倍数表示出来,并且要用指定的k个数,输出一种即可。
解题思路:我们知道任意一个数都可以通过2的倍数组成,这其中的原因可以通过十进制转换二进制来说明。
如果该数的二进制对应数中1的个数大于k,那么很显然不会有k个2的倍数组成该数;如果恰好相等,那么只需要将二进制各个位上的1转换为对应的十进制即可;如果该数的二进制对应数中1的个数小于k,那么就需要拆分二进制了,这里我从高位来开始拆分,每当高位-1时,对应的下一位将会+2,这里存放二进制的数组里将不再仅仅存放0和1了,这时候存放的是对应二进制位数的个数了,只要拆分到恰够k个即可。同时要注意pow函数的使用,这个函数返回值是double类型的,注意转换。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int n,k,counts,i,j,x,y,a,ans;
int b[];
scanf("%d%d",&n,&k);
counts=;
x=;
a=n;
while(a)
{
if(a%)
{
counts++;
}
b[x]=a%;
x++;
a/=;
}
//printf("%d\n",counts);
//printf("%d\n",x);
if(k<counts||k>n)///不满足条件的情况
{
printf("NO\n");
}
else
{
printf("YES\n");
if(counts==k)///直接按照进制,不需要拆分
{
for(i=; i<x; i++)
{
if(b[i])
{
ans=int(pow(,i));
printf("%d ",ans);
}
}
}
else///即k>counts,从高位开始拆分,高位-1,相当于低位+2,counts+1
{
y=x-;///最高位
while(counts!=k)///终止条件
{
while(b[y]>=)
{
b[y]--;
b[y-]+=;
counts++;
if(counts==k)
{
break;
}
}
y--;
}
for(i=x-; i>=; i--)///输出
{
if(b[i]>=)///注意这里b[i]上的值代表的是该位上对应2^i的个数
{
for(j=; j<b[i]; j++)
{
ans=int(pow(,i));
printf("%d ",ans);
}
}
}
}
}
return ;
}
CF 1095C Powers Of Two(二进制拆分)的更多相关文章
- CF 1095C Powers Of Two
题目连接:http://codeforces.com/problemset/problem/1095/C 题目: C. Powers Of Two time limit per test 4 seco ...
- HDU1059 二进制拆分优化多重背包
/*问你能不能将给出的资源平分成两半,那么我们就以一半为背包,运行多重背包模版 但是注意了,由于个数过大,直接运行会超时,所以要用二进制拆分每种的个数*/ #include<stdio.h> ...
- BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...
- hdu 2844 coins(多重背包 二进制拆分法)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- HDU 4135:Co-prime(容斥+二进制拆分)
Co-prime Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 2018.09.08 bzoj1531: [POI2005]Bank notes(二进制拆分优化背包)
传送门 显然不能直接写多重背包. 这题可以用二进制拆分/单调队列优化(感觉二进制好写). 所谓二进制优化,就是把1~c[i]拆分成20,21,...2t,c[i]−2t+1+1" role= ...
- 【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan
题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少. 其实就是dijkstra,只不过往堆里塞边的时候,要注意塞进去它是从集合中的哪个起始点过来的,然后在更新某个点的答案的时 ...
- 【找规律】【二进制拆分】hdu6129 Just do it
给你数列a,问你对它作m次求前缀异或和之后的新数列是什么. 考虑a1对最终生成的数列的每一位的贡献,仅仅考虑奇偶性, 当m为2的幂次的时候,恰好是这样的 2^0 1 1 1 1 1 ... 2^1 1 ...
- 【题解】Coins(二进制拆分+bitset)
[题解]Coins(二进制拆分+bitset) [vj] 俗话说得好,bitset大法吼啊 这道题要不是他多组数据卡死了我复杂度算出来等于九千多万的选手我还不会想这种好办法233 考虑转移的实质是怎样 ...
随机推荐
- C#中控件Control的Paint事件和OnPaint虚函数的区别
句柄 : 句柄,是整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按 ...
- linux 缓存手动清除
linux下怎么清理缓存 free -m 命令可以查看内存使用情况 sysctl 命令可以临时改变某个系统参数 如:sysctl -w net.ipv4.ip_f ...
- git的安装以及简单使用
前提准备: 1.已有github官网账号:(若无,注册流程百度一下) 2.git安装包,官网下载:https://git-scm.com/downloads.(顺带吐槽下,真是龟速下载.) 一.安装g ...
- P1437 [HNOI2004]敲砖块
题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...
- 四步掌握CAN节点隔离设计
四步掌握CAN节点隔离设计 “隔离”是模块为CAN节点设备提供可靠数据传输的首要保障,通常隔离模块的“隔离”是指模块上电后,能为节点提供信号隔离及电源隔离,隔离电压等级以2500VDC.3500VDC ...
- C++学习第一天(helloword)
C++编译过程 #include <iostream> //iostream 提供了一个叫命名空间的东西,标准的命名空间是std 包含了有关输入输出语句的函数 // input&^ ...
- 20145234黄斐《网络对抗技术》实验九、Web安全基础实践
PS:我是分了两次做的这次试验,第二次实验的时候电脑出了一点问题熄火了……原本后面的是有图的结果博客没保存图没了…… WebGoat WebGoat是由著名的OWASP负责维护的一个漏洞百出的J2EE ...
- ASP.NET Core开发期间部署到IIS自定义主机域名并附加到进程调试
在.NET Framework环境下,我们经常会这么做 把一个web项目不经过发布直接部署到IIS里去,配置上主机名,修改一下hosts文件,就可以用自定义的域名来访问我们的应用程序,使用附加到进程( ...
- 通过IDEA解决spring配置文件
来自:https://blog.csdn.net/yanghanxiu/article/details/79366263 (其实尼可以使用springboot 这样就不用配置一大堆东西了喵!) 每次创 ...
- Python面向对象之封装、property特性、绑定方法与非绑定方法
一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...