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号