Cod sursa(job #173808)

Utilizator alecmanAchim Ioan Alexandru alecman Data 8 aprilie 2008 08:24:11
Problema Farfurii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>
#include<vector>

using namespace std;

#define INPUT "farfurii.in"
#define OUTPUT "farfurii.out"
#define NMAX 100001
#define LL long long
#define pb push_back

FILE *fin = fopen(INPUT, "r"), *fout = fopen(OUTPUT, "w");

LL N, K;

vector<LL> final;

void readValues()
{
  fscanf(fin, "%lld %lld", &N, &K);
}

void printSolution()
{
  for(LL i = 0; i < N; ++i)
    fprintf(fout, "%lld ", final[ i ]);

  fprintf(fout, "\n");
}

void solveFunction()
{
  LL cont = 0, prod = 1, rest, nrNum, maxim, scad;

  while(prod <= K)
  {
    prod = cont * (cont + 1) / 2;
    ++cont;    
  }

  --cont;
  prod = (cont - 1) * cont / 2;

  rest = K - prod;

  if(!rest)
  {
    nrNum = N - cont;

    for(LL i = 1; i <= nrNum; ++i)
      final.pb(i);    

    maxim = N;

    for(LL i = nrNum + 1; i <= N; ++i)
    {
      final.pb(maxim);
      --maxim;
    }

    printSolution();
  }
  else
  {
    ++cont;

    nrNum = N - cont + 1;

    for(LL i = 1; i < nrNum; ++i)
      final.pb(i);

    scad = cont - rest;

    final.pb( N - scad + 1);

    maxim = N;
    
    for(LL i = nrNum + 1; i <= nrNum + scad - 1; ++i)
    {
      final.pb(maxim);
      --maxim;
    }

    maxim = N - scad;

    for(LL i = nrNum + scad; i <= N; ++i)
    {
      final.pb(maxim);
      --maxim;
    }

    printSolution();
  }
}

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}