题目
题目描述
构造一个长度为
n
n
n 的序列
a
1
,
a
2
,
a
3
,
…
,
a
n
a_1,a_2,a_3,\dots,a_n
a1,a2,a3,…,an ,使得其满足如下条件。
- 10 ≤ n ≤ 1 0 3 10\le n\le 10^3 10≤n≤103
- ∀ x ∈ [ 1 , n ] , ∣ a x ∣ ≤ 1 0 9 \forall x\in[1,n],|a_x|\le 10^9 ∀x∈[1,n],∣ax∣≤109
- μ = ∑ x = 1 n a x n \mu=\frac{\sum_{x=1}^{n}a_x}{n} μ=n∑x=1nax ,即平均数为 μ \mu μ
- ν = ∑ x = 1 n ( a x − μ ) 2 n ν=\frac{\sum_{x=1}^{n}(a_x-\mu)^2}{n} ν=n∑x=1n(ax−μ)2 ,即方差为 ν ν ν
输出任意一组解即可。
数据范围与约定
数据组数
T
≤
10
,
μ
≤
1
0
6
,
0
≤
ν
≤
1
0
9
T\le 10,\mu\le 10^6,0\le ν\le 10^9
T≤10,μ≤106,0≤ν≤109
思路
首先将所有的 a a a 减去一个 μ \mu μ ,可以简化一下题意:
- 一次方之和为零。即 ∑ x = 1 n a x = 0 \sum_{x=1}^{n}a_x=0 ∑x=1nax=0 。
- 二次方之和为 n ν nν nν 。即 ∑ x = 1 n a x 2 = n ν \sum_{x=1}^{n}a_x^2=nν ∑x=1nax2=nν 。
为了满足第一条,我们规定 2 ∣ n 2|n 2∣n ,且 ∀ k ∈ [ 1 , n 2 ] , a 2 k − 1 + a 2 k = 0 \forall k\in[1,\frac{n}{2}],a_{2k-1}+a_{2k}=0 ∀k∈[1,2n],a2k−1+a2k=0 。
此时,我们只需要求一个长度为 n 2 \frac{n}{2} 2n 的数列 ⟨ b i ⟩ \langle b_i\rangle ⟨bi⟩,并且满足 ∑ x = 1 n / 2 b x 2 = n ν 2 \sum_{x=1}^{n/2}b_x^2=\frac{nν}{2} ∑x=1n/2bx2=2nν
这并不难,只需要每次将 b x b_x bx 取的尽量大即可。因为最后一定有解(只要取 b x = 1 b_x=1 bx=1 就行了)。
n n n 可以任取一个足够大的偶数,取 n = 1 0 3 n=10^3 n=103 是最好的。
代码
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
inline int readint(){
int a = 0; char c = getchar(), f = 1;
for(; c<'0' or c>'9'; c=getchar())
if(c == '-') f = -f;
for(; '0'<=c and c<='9'; c=getchar())
a = (a<<3)+(a<<1)+(c^48);
return a*f;
}
inline void writeint(long long x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) writeint(x/10);
putchar((x%10)^48);
}
# define MB template < class T >
MB void getMax(T &a,const T &b){ if(a < b) a = b; }
MB void getMin(T &a,const T &b){ if(b < a) a = b; }
const int MaxN = 1005;
int a[MaxN];
int main(){
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
for(int T=readint(); T; --T){
int u = readint();
long long v = readint();
int n = 1000; v *= n;
for(int i=1; i<=(n>>1); ++i){
a[i] = int(sqrt(v>>1));
v -= 2ll*a[i]*a[i];
}
printf("%d\n",n);
for(int i=1; i<=(n>>1); ++i)
printf("%d %d ",a[i]+u,-a[i]+u);
putchar('\n');
}
return 0;
}