// {{{
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define each(...) for (auto& __VA_ARGS__)
#define rep(i, b, e) for (int i = (b); i <= (e); i++)
#define rev(i, b, e) for (int i = (e); i >= (b); i--)
#define mp make_pair
#define mt make_tuple
#define x first
#define y second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#ifdef SPONGE
#define dbg(f, ...) fprintf(stderr, "\033[1;33m" f "\033[0m", ##__VA_ARGS__)
#else
#define dbg(...) 1
#endif
#define tC template<class
using namespace std;
tC T> using V = vector<T>;
tC T1, class T2> using P = pair<T1,T2>;
tC T, class C=greater<T>> using PQ = priority_queue<T,V<T>,C>;
using ll = long long;
using ld = long double;
using ul = unsigned long long;
using pii = P<int,int>;
using pll = P<ll,ll>;
using pld = P<ld,ld>;
using vi = V<int>;
using vll = V<ll>;
using vld = V<ld>;
using vb = V<bool>;
using vs = V<string>;
using vpii = V<pii>;
using vpll = V<pll>;
using vpld = V<pld>;
tC T> int sz(const T& a) { return (int)a.size(); }
tC T> bool amin(T& a, T b) { return b < a ? a = b, 1 : 0; }
tC T> bool amax(T& a, T b) { return b > a ? a = b, 1 : 0; }
const size_t rseed = 4488;
// chrono::high_resolution_clock::now().time_since_epoch().count();
mt19937 rnd(rseed);
tC T> T rand(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); }
const int oo = 1e9 + 1;
const ll OO = 1e18 + 1;
namespace { void solve(); }
// }}}
int main()
{
int t = 1;
// scanf("%d", &t);
rep(i, 1, t) {
// printf("Case #%d: ", i);
solve();
}
}
namespace {
const int N = 1e6;
const int M = 2e5;
int n, nast[M + 1][20], bity[M + 1], dp[N + 50];
void solve()
{
scanf("%d", &n);
rep(i, 0, M) {
int x = i, ile = 0;
rep(k, 0, 18) {
nast[i][k] = oo;
}
rep(k, 0, 18) {
if (x & (1 << k)) ile++;
}
bity[i] = ile;
rep(k, 0, 18) {
if ((x & (1 << k)) == 0) {
int y = x ^ (1 << k);
rep(j, 0, k) {
amin(nast[i][ile + 1 + j], y ^ ((1 << j) - 1));
}
}
else {
x ^= (1 << k);
ile--;
}
}
}
dp[0] = 0;
rep(i, 1, n) dp[i] = oo;
rep(i, 0, n) rep(j, 1, 18) amin(dp[i + j], nast[dp[i]][j]);
/*
rep(i, 0, 5) {
rep(j, 1, 5) printf("%d ", nast[i][j]);
printf("\n");
}
*/
/*
rep(i, 0, n) {
dbg("%d -> %d\n", i, dp[i]);
}
*/
vi odp;
while (n > 0) {
odp.pb(dp[n]);
n -= bity[dp[n]];
}
printf("%d\n", sz(odp));
each(x : odp) printf("%d ", x);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | // {{{ #define _USE_MATH_DEFINES #include <bits/stdc++.h> #define each(...) for (auto& __VA_ARGS__) #define rep(i, b, e) for (int i = (b); i <= (e); i++) #define rev(i, b, e) for (int i = (e); i >= (b); i--) #define mp make_pair #define mt make_tuple #define x first #define y second #define pb push_back #define all(x) (x).begin(), (x).end() #ifdef SPONGE #define dbg(f, ...) fprintf(stderr, "\033[1;33m" f "\033[0m", ##__VA_ARGS__) #else #define dbg(...) 1 #endif #define tC template<class using namespace std; tC T> using V = vector<T>; tC T1, class T2> using P = pair<T1,T2>; tC T, class C=greater<T>> using PQ = priority_queue<T,V<T>,C>; using ll = long long; using ld = long double; using ul = unsigned long long; using pii = P<int,int>; using pll = P<ll,ll>; using pld = P<ld,ld>; using vi = V<int>; using vll = V<ll>; using vld = V<ld>; using vb = V<bool>; using vs = V<string>; using vpii = V<pii>; using vpll = V<pll>; using vpld = V<pld>; tC T> int sz(const T& a) { return (int)a.size(); } tC T> bool amin(T& a, T b) { return b < a ? a = b, 1 : 0; } tC T> bool amax(T& a, T b) { return b > a ? a = b, 1 : 0; } const size_t rseed = 4488; // chrono::high_resolution_clock::now().time_since_epoch().count(); mt19937 rnd(rseed); tC T> T rand(T lo, T hi) { return uniform_int_distribution<T>{lo,hi}(rnd); } const int oo = 1e9 + 1; const ll OO = 1e18 + 1; namespace { void solve(); } // }}} int main() { int t = 1; // scanf("%d", &t); rep(i, 1, t) { // printf("Case #%d: ", i); solve(); } } namespace { const int N = 1e6; const int M = 2e5; int n, nast[M + 1][20], bity[M + 1], dp[N + 50]; void solve() { scanf("%d", &n); rep(i, 0, M) { int x = i, ile = 0; rep(k, 0, 18) { nast[i][k] = oo; } rep(k, 0, 18) { if (x & (1 << k)) ile++; } bity[i] = ile; rep(k, 0, 18) { if ((x & (1 << k)) == 0) { int y = x ^ (1 << k); rep(j, 0, k) { amin(nast[i][ile + 1 + j], y ^ ((1 << j) - 1)); } } else { x ^= (1 << k); ile--; } } } dp[0] = 0; rep(i, 1, n) dp[i] = oo; rep(i, 0, n) rep(j, 1, 18) amin(dp[i + j], nast[dp[i]][j]); /* rep(i, 0, 5) { rep(j, 1, 5) printf("%d ", nast[i][j]); printf("\n"); } */ /* rep(i, 0, n) { dbg("%d -> %d\n", i, dp[i]); } */ vi odp; while (n > 0) { odp.pb(dp[n]); n -= bity[dp[n]]; } printf("%d\n", sz(odp)); each(x : odp) printf("%d ", x); } } |
English