Cod sursa(job #215766)

Utilizator savimSerban Andrei Stan savim Data 20 octombrie 2008 21:43:50
Problema Farfurii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <stdio.h>

long long n,k,p,q,i,dif,elem,r;
long long afis[100010];

int main() {

    freopen("farfurii.in","r",stdin);
    freopen("farfurii.out","w",stdout);
    
    scanf("%lld %lld",&n,&k);

    p =0; q = k + 1; elem = n;
    while (p + 1 < q) {
          r = 1L * (p + q) / 2;
          if (1L * r * (r + 1) / 2 <= 1L * k) {
             dif = 1L * r * (r + 1) / 2;
             p = r;
          }
          else q = r;
    }
 
    dif = k - dif;
    
    for (i = n - p; i <= n - dif; ++i, elem--)
        afis[i] = elem;
    if (dif) afis[n - p - 1] = elem--;
    for (i = n - dif + 1; i <= n; ++i, elem--)
        afis[i] = elem;
    elem = 1;
    for (i = 1; i <= n - p - 2; i++, elem++)
        afis[i] = elem;
    if (!dif) afis[n - p - 1] = elem++;
        
    for (i = 1; i <= n; i++)
        printf("%lld ",afis[i]);
    printf("\n");    

    return 0;
}