列表

详情


NC20813. 黄魔法师

描述

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

给出 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。如果有多解,输出任意一个即可。

示例1

输入:

3 2

输出:

1 3 6

说明:

满足条件的有 (1, 2), (2, 3) 两对。

示例2

输入:

3 1000000000

输出:

-1

说明:

显然不存在满足条件的数组。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 15ms, 内存消耗: 1112K, 提交时间: 2018-10-27 23:41:45

#include<iostream>
#include<stdio.h>
#include<algorithm>
#define LL long long
using namespace std;
const int maxn=1e5+10;
int n;LL k;
int a[maxn];
int main()
{
    scanf("%d%lld",&n,&k);
    LL mx=1LL*n*(n-1)/2;
    if(k>mx)printf("-1\n");
    else
    {
        for(int i=n;i;i--)
            if(mx-k>=i-1)mx-=i-1,a[i]=3;
            else
            {
                a[1]=14;
                int j;
                for(j=i;i-j<mx-k;j--)a[j]=98;
                for(;j>1;j--)a[j]=2;
                break;
            }
        for(int i=1;i<=n;i++)printf("%d ",a[i]);
         
    }
    return 0;
}

C++(clang++11) 解法, 执行用时: 7ms, 内存消耗: 760K, 提交时间: 2021-02-22 08:36:20

#include <iostream>
#include <cstdio>
#define int long long
#define N 100002
using namespace std;
int n,k,m=1,i;
signed main()
{
	scanf("%lld%lld",&n,&k);
	if(k>n*(n-1)/2){
		puts("-1");
		return 0;
	}
	while(m*(m-1)/2<k) m++;
	for(i=1;i<=m-(m*(m-1)/2-k)-1;i++) printf("2 ");
	for(i=1;i<=m*(m-1)/2-k;i++) printf("98 ");
	printf("7 ");
	for(i=1;i<=n-m;i++) printf("1 ");
	puts("");
	return 0;
}

上一题