Wannafly挑战赛27: E. 黄魔法师(构造)

版权声明:本文为博主原创文章,你们可以随便转载 https://blog.csdn.net/Jaihk662/article/details/83422871

链接:https://www.nowcoder.com/acm/contest/215/E
来源:牛客网
 

题目描述

“恕瑞玛,你的皇帝回来啦!”--黄魔法师

给出 n, k,求一个长度为 n 的数组 a, 满足有恰好 k 对数对 (i, j) (1 <= i < j <= n) 满足 ai + aj 为完全平方数。如果不存在,输出 -1。

输入描述:

第一行两个整数 n, k (1 <= n <= 105, 0 <= k <= 1010)

输出描述:

如果这样的数组不存在,输出 -1。
反之,输出一行 n 个整数,表示 a 数组,其中 1 <= ai <= 105。如果有多解,输出任意一个即可。

输入

3 2

输出

1 3 6

分三种情况考虑:

①n*(n-1)/2<k:很显然无解,就算任意一对数加起来都是完全平方数也不够,输出-1(否则一定有解

②n*(n-1)/2==k:全部输出2即可,这个时候每一对ai+aj都是4,满足条件(前两种情况非常简单)

③n*(n-1)/2>k:步骤如下:

  • 找到一个最大的p满足p*(p-1)/2≤k,设last = k-p*(p-1)/2
  • 找到4个数x, y, c, d满足只有2*x,2*y,x+y,c+y是完全平方数(x = 98, y = 2, c = 7, d = 100000就是一组合法解)
  • 只要输出last个y,p-last个x,1个c,剩下全部输出d即可,一定满足条件
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
int main(void)
{
	LL n, k, i, x, p;
	scanf("%lld%lld", &n, &k);
	if(n*(n-1)/2==k)
	{
		for(i=1;i<=n;i++)
			printf("2 ");
		puts("");
	}
	else if(n*(n-1)/2<k)
		printf("-1\n");
	else
	{
		for(p=1;(p+1)*p/2<=k;p++);
		x = k-p*(p-1)/2;
		for(i=1;i<=x;i++)
			printf("2 ");
		for(i=1;i<=p-x;i++)
			printf("98 ");
		printf("7 ");
		for(i=1;i<=n-p-1;i++)
			printf("100000 ");
		puts("");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Jaihk662/article/details/83422871