abc068d <思维 + 构造>

发布时间 2023-07-10 15:50:18作者: O2iginal

D - Decrease (Contestant ver.)
逆向构造(操作)思维 ~

// https://atcoder.jp/contests/abc068/tasks/arc079_b
// <思维 + 构造>
// 使用 n = 50 构造
// 逆向思考, 假设操作最终得到 0 1 2 ... 49, 
// 那么 每次逆向操作, 取最小数 + 50, 其他数 -1, 如此操作 k 次, 即得到答案 ;
// 会发现 0 1 ... 49, 逆向操作 50 次后, 得到 1 2 ... 50,
// 因而若 50 | k, 则答案为 [0 1 2 ... 49] + (k/50),
// 而当不整除时, 则需将多出部分 k % 50 次额外操作
// 参考 : https://blog.csdn.net/eyuhaobanga/article/details/129187275
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
using LL = long long;

void solv()
{
    LL k;
    cin >> k;
    cout << 50 << endl;

    int t = k % 50;
    for (int i = 0; i < 50; i++) {
        cout << i + k / 50 + ((i < t) * (50 + 1) - t) << ' ';
        // i + k / 50 为进行 k / 50 * 50 次操作后的结果
        // 而后再进行 k % 50 次操作, 即 + ((i < t) * (50 + 1) - t)
    }

    // // 另一种简洁的写法
    // for (int i = 0; i < 50; i++) {
    //     cout << i + (k + i) / 50 << " \n"[i == 49];
    // }
}

int main()
{
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T = 1;
	// cin >> T;
    while (T --)
    {
        solv();
    }
    return 0;
}