构造一个序列 满足以下条件:
- 长度为 。
- 。
- 。
- 满足 且 的三元组 数量恰好为 。
,。
考虑填入正整数序列。
,贡献为 ,不难发现这样构造的三元组是最多的,因为 前面的 个数除了中间那个都会参与贡献。
那么如果这样构造都不够就不合法,否则一直填直到总是 ,假设多了 个,不难发现最后填到的这个位置每 三元组个数就会 ,所以当前位置直接加上 即可。
如果最后没有填满 个数,假设最大数为 ,那么依次填入 即可。
代码如下:
#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;
}