\(\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;
}
标签:le,int,题解,Sum,texttt,long,Range,序列
From: https://www.cnblogs.com/lstylus/p/18442487