Math

280 篇文章 1 订阅

题目

题目描述
构造一个长度为 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 10n103
  • ∀ x ∈ [ 1 , n ] , ∣ a x ∣ ≤ 1 0 9 \forall x\in[1,n],|a_x|\le 10^9 x[1,n],ax109
  • μ = ∑ x = 1 n a x n \mu=\frac{\sum_{x=1}^{n}a_x}{n} μ=nx=1nax ,即平均数为 μ \mu μ
  • ν = ∑ x = 1 n ( a x − μ ) 2 n ν=\frac{\sum_{x=1}^{n}(a_x-\mu)^2}{n} ν=nx=1n(axμ)2 ,即方差为 ν ν ν

输出任意一组解即可。

数据范围与约定
数据组数 T ≤ 10 , μ ≤ 1 0 6 , 0 ≤ ν ≤ 1 0 9 T\le 10,\mu\le 10^6,0\le ν\le 10^9 T10,μ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 2n ,且 ∀ 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],a2k1+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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值