设单次攻击次数为s,双击次数为d 则有s+d=k,s+2d=a 即d=a-k

因此对d这个固定值进行分析

如果d>a/2,虚空索敌,-1退出;
如果d<n/2,整个数组每个数至少是1,这种情况下肯定不能把整个数组变成0,-1退出;

构造策略采取控制前两个数,剩余n-2全部赋为1,这 个 1 自身会产生 次双重攻击,剩下 由前两个数构造,直接令第 2 个元素的值等于 ,剩下的即位第一个元素。

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ui = unsigned;
using ulll = unsigned __int128;
using lll = __int128;
using db = double;
using ldb = long double;
using b20 = bitset<20>;

const int Inf = 0x3f3f3f3f;
const ll Linf = 0x3f3f3f3f3f3f3f3fLL;
const db Dinf = 1e18;
const int Maxm = 400005;
const int Maxn = 10005;
const int MOD[] = {998244353, 1000000007};

#define endl '\n'
//------------------------------------------------------------------

void solve() {
    ll n, a, k;
    cin >> n >> a >> k;
    if (n == 1) {
        cout << ((a == k) ? a : -1) << endl;
        return;
    }
    ll d = a - k;
    if (d * 2 > a) {
        cout << -1 << endl;
        return;
    } else if (d < n / 2) {
        cout << -1 << endl;
        return;
    } else {
        ll x = d - (n - 2) / 2;
        ll y = a - x - n + 2;
        cout << max(x, y) << ' ' << min(x, y) << ' ';

        for (ll i = 0; i < n - 2; ++i) cout << 1 << ' ';
        cout << endl;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();

    return 0;
}