题解 CF1785D - Range = √Sum

link

\(\texttt{Describe}\)

构造有 \(n\) 个数的序列,满足以下条件:

  • \(\forall i \in [1,n]\) 并且 \(1 \le a_i \le 10^9\)

  • 对于任何的 \(1 \le i,j \le n(i \ne j)\)\(a_i \ne a_j\)

  • \((\max_{i=1}^{n}a_i- \min_{i=1}^{n}a_i)^2 = \sum_{i=1}^{n}a_i\)

\(\texttt{Solution}\)

显然构造题。

我们假设\(\sum a_i\)\(4n^2\),则 \(\max{a_i} - \min{a_i}=2n\)

显然最简单的序列是 \(1,2,\dots ,n-1 ,2n+1\)​,然后我们考虑如何使他接近合法。

我们记 \(s_1\)\(1+2+\dots+(n-1)+(2n+1)\)

我们把整个序列 \(+1\),然后整个序列的和就会加上 \(n\)​。

显然可以把整个序列加上

\[d=\biggl\lfloor \frac{4n^2-s_1}{n} \biggl\rfloor \]

就可以了。

肯定还有剩下没有加进去的 \(4n^2-(dn+s_1)\),记作 \(s_3\),显然 \(0 \le s_3 \le n-1\)

让第 \(n-1\) 个数加上 \(s_3\) 即可。

\(\texttt{Code}\)

//Range = √Sum.cpp
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define int long long

const int N = 3e5 + 10;

int a[N];

void solve() {
	memset(a, 0, sizeof a);
	int n; cin >> n;
	
	int sum = 4 * n * n;
	
	for (int i = 1; i <= n - 1; ++i) a[i] = i;
	a[n] = 2 * n + 1;
	
	int tot = 0;
	for (int i = 1; i <= n; ++i) tot += a[i];
	
	int d = (sum - tot) / n;
	
	a[n - 1] += sum - tot - d * n;
	
	for (int i = 1; i <= n; ++i) cout << a[i] + d << ' ';
	
	cout << '\n';
}

signed main() {
	ios::sync_with_stdio(false); cin.tie(0), cout.tie(0);
	
	int T; cin >> T; while (T --) solve();
	return 0;
}
posted @ 2024-09-30 21:54  Pdise  阅读(28)  评论(0)    收藏  举报