Enlace al
tema La idea principal del tema: los
números dados ny m. Construyamos una matriz entera positiva y de tamaño n. Hay dos condiciones:
- La matriz debe ser una matriz estrictamente creciente, y el número en la matriz no puede exceder 10 9 .
- La matriz debe contener m triples, de los cuales triples (i, j, k) deben satisfacer ans [i] + ans [j] = ans [k], (1≤i <j <k≤n)
Ideas para resolver problemas:
podemos ver que una estructura es suponer que el número actual es cur, y m en este momento es 0, y suponemos que k = cur + 1. Entonces la siguiente matriz es cur + k, cur + 2 k, cur + 3 k, ... cur + m * k, entonces la diferencia entre estos dos números debe ser un múltiplo de k, pero ninguno de los números que construimos después de cur Múltiplo de k. Debido a que los números antes de cur son menores que k, los números antes de cur también son imposibles. Entonces podemos lidiar con la situación de m = 0 de acuerdo con esta estrategia de construcción.
Si m no es igual a 0, podemos ver que construir 1,2,3,4,5 generará la mayor cantidad de triples. Entonces, codiciosos para quedarnos sin m primero, y luego construir de acuerdo con la estrategia anterior.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[6000],m;
int main()
{
ll n;
cin>>n>>m;
ll k=2;
a[1]=1;
for (int i=2;i<=n;i++)
{
if (m==0)
{
a[i]=a[i-1]+k;
continue;
}
if (m>(i-1)/2)
{
a[i]=i;
m-=(i-1)/2;
}
else
{
ll r=i-1,l=i-m*2;
a[i]=a[l]+a[r];
m=0;
k=a[i]+1;
}
}
if (m>0)
{
cout<<-1;
return 0;
}
for (int i=1;i<=n;i++)
cout<<a[i]<<" ";
}