【Codeforces】Codeforces Round #836 (Div. 2) D. Range = √Sum | 构造

149 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

【Codeforces】Codeforces Round #836 (Div. 2) D. Range = √Sum | 构造

题目链接

Problem - D - Codeforces

题目

image.png

题目大意

对于给定的 nn 构造一个所有元素互不相同的正整数数组 a1,a2,a3,...,ana_1,a_2,a_3,...,a_n,数组内元素均不超过 10910^9,且满足以下条件:

max(a1,a2,a3,...,an)min(a1,a2,a3,...,an)=a1+a2+a3+...+an\max(a_1,a_2,a_3,...,a_n)-\min(a_1,a_2,a_3,...,a_n)=\sqrt{a_1+a_2+a_3+...+a_n}

注意这里的开根号不进行舍入。

思路

注意这里的开根号不进行舍入。

赛中特意发了通知强调这件事……

左半部分显然一定是整数,顺着这个思路我们试图把右边的东西构造成整数,也就是让 a1+a2+a3+...+ana_1+a_2+a_3+...+a_n 成为一个完全平方数。

因为有 nn 个数让我们可以随便乱构造,很容易想到我们先确定一个平均数然后对称放置。当所有数的平均数是 4n4n 时,

a1+a2+a3+...+an=4n2a1+a2+a3+...+an=2n\begin{aligned} a_1+a_2+a_3+...+a_n&=4n^2\\ \sqrt{a_1+a_2+a_3+...+a_n}&=2n \end{aligned}

所以我们只需要让最小的数字是 4nn4n-n,最大的数字是 4n+n4n+n就可以了。中间的数字同样以 4n4n 为轴对称输出,在 (3n,5n)(3n,5n) 范围内即可。

本题解法很多,这里只给出我在赛中的思路。

代码

#include <iostream>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
using LL=long long;
const int N=500001;
const LL mod=1000000007;
int n,m,k,x,y,z,tot,a[N],b[N];
LL solve()
{
	scanf("%d",&n);
	if (n%2) printf("%d ",4*n);
	for (int i=1;i<=n/2-1;++i) printf("%d %d ",4*n+i,4*n-i);
	printf("%d %d\n",4*n+n,4*n-n);
	return 0;
}
int main()
{
	int T=1;
	scanf("%d",&T);
	while (T--) solve();
	return 0;
}

Other

这场 CF 堪称 constructforce……

第一次在 div2 能够 rank 两位数还是很开心的qwq

不过罚坐一个小时也没有做出 E 题,赛后发现 E 题跟我在高中校内出的一道题很像,唉……许愿今年可以上橙qwq image.png