Quasi Binary
题目大意
就是给你一个数 ,然后你要把
表示成看上去像二进制的十进制数的和,要求这样的数越少越好
分析
对于一个十进制数 ,可以表示为
那么这个可以作为其中一些不是最优的解,那么我们考虑优化一下上面的这个东西
根据乘法分配律,对于前面那个东西相同的部分是可以合并的,那么就可以变成
那么更显然的是啥呢,就是所有的 都是一定不同的,所以可以直接把小的部分合并到大的部分中,其中这并不会产生进位,就是说最后不会影响答案的正确性,那么最后的答案就是
那么就是可以枚举每一位,令第 的大小为
,那么就可以随机找
个将要输出的值加上
即可。
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
inline int __read()
{
int x(0), t(1);
char o (getchar());
while (o < '0' || o > '9') {
if (o == '-') t = -1;
o = getchar();
}
for (; o >= '0' && o <= '9'; o = getchar()) {
x = (x << 1) + (x << 3) + (o ^ 48);
}
return x * t;
}
int ans[10], len;
int main()
{
int x = __read();
for (int i = 1; i <= x; i *= 10) {
int temp = x / i % 10;
len = max(len, temp);
for (int j = 1; j <= temp; ++j) ans[j] += i;
}
printf ("%d\n", len);
for (int i = 1; i <= len; ++i) printf("%d\n", ans[i]);
puts("");
} 
京公网安备 11010502036488号