Cod sursa(job #173701)

Utilizator alecmanAchim Ioan Alexandru alecman Data 7 aprilie 2008 23:01:41
Problema Farfurii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include<stdio.h>

#define INPUT "farfurii.in"
#define OUTPUT "farfurii.out"
#define NMAX 100001

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

long long final[ NMAX ], N, K;

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

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

  fprintf(fout, "\n");
}

void solveFunction()
{
  long long prod, cont, rest, nrNum, ind, maxim, i, start;

  prod = 1;
  cont = 1;

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

  --cont;
  --cont;

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

  rest = K - prod;

  nrNum = N - cont - 1;

  if(rest)
    --nrNum;

  for(i = 1; i <= nrNum; ++i)
    final[ i ] = i;

  ind = cont - rest;
  if(rest)
  {
    ++ind;
    final[ nrNum + 1 ] = nrNum + ind + 1;

  maxim = N;

  for(i = nrNum + 2; i <= N - ind; ++i)
  {
    final[ i ] = maxim;
    --maxim;
  }

  }

  maxim = nrNum + ind;
  start = N - ind + 1;

  if(!rest)
  {
    ++maxim;
    start = N - ind;
  }

  for(i = start; i <= N; ++i)
  {
    final[ i ] = maxim;
    --maxim;
  }

  printSolution();
}

int main()
{
  readValues();

  solveFunction();

  fclose(fin);
  fclose(fout);

  return 0;
}