给定一个数 $k$,要求构造一个非负整数序列,使得操作 $k$ 次后,最大数 $\leq n - 1$,每次操作选序列中最大值,将其 $-n$,其余数 $+1$。
链接
ARC 079D
题解
考虑反向操作,对于序列 $0, 1, \cdots, n - 1$,我们对依次对每个数 $+n$,其余数 $-1$,那么显然对于每个数我们可以这样操作 $steps = \lfloor \frac k n \rfloor$ 次,此时
$$a_i = a_i + steps \times n - (n - 1) \times steps = i + steps$$
对于剩下的次数,我们依次暴力修改就可以了。
代码
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
|
#include <bits/stdc++.h>
namespace {
typedef unsigned long long ulong;
const int MAXN = 50; ulong a[MAXN];
inline void solve() { std::ios::sync_with_stdio(false), std::cin.tie(NULL), std::cout.tie(NULL); register ulong n; std::cin >> n; register ulong steps = n / MAXN, remain = n % MAXN; for (register int i = 0; i < MAXN; i++) a[i] = i + steps; for (register int i = 0; i < remain; i++) { a[i] += MAXN; for (register int j = 0; j < i; j++) a[j]--; for (register int j = i + 1; j < MAXN; j++) a[j]--; } std::cout << "50\n"; for (register int i = 0; i < MAXN; i++) std::cout << a[i] << ' '; } }
int main() { solve(); return 0; }
|