构造一个序列 满足以下条件:
- 长度为 。
- 。
- 。
- 满足 且 的三元组 数量恰好为 。
,。
考虑填入正整数序列。
,贡献为 ,不难发现这样构造的三元组是最多的,因为 前面的 个数除了中间那个都会参与贡献。
那么如果这样构造都不够就不合法,否则一直填直到总是 ,假设多了 个,不难发现最后填到的这个位置每 三元组个数就会 ,所以当前位置直接加上 即可。
如果最后没有填满 个数,假设最大数为 ,那么依次填入 即可。
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
const int S=5005;
int n,m;
int a[S];
int main()
{
	scanf("%d%d",&n,&m);
	int tot=0;
	for(int i=1;i<=n;i++)
	{
		 a[i]=i;
		 tot+=(i-1)/2;
		 if(tot>=m)
		 {
		 	int w=tot-m;
		 	a[i]+=w*2;
		 	for(int j=i+1;j<=n;j++) a[j]=a[i]*((j-i)*2+1);
		 	for(int j=1;j<=n;j++) printf("%d ",a[j]);
		 	printf("\n");
		 	return 0;
		 }
	}
	puts("-1");
	return 0;
}
