链接: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;
}