Pagini recente » Cod sursa (job #1073205) | Cod sursa (job #2569924) | Cod sursa (job #834670) | Cod sursa (job #278813) | Cod sursa (job #357432)
Cod sursa(job #357432)
#include <cstdio>
#define N 100001
long long n,m;
void rezolvare()
{
long long p,val,val_modificata;
for (p = 1; p <= n; ++p)//Daca ordonam descrescator sirul, fiecare termen al sirului se cupleaza cu toti cei de dupa el (suma combinatiilor pt fiecare nr n-1+...+1+0) , deci (n-1)(n)/2. Inlocuim n cu n-p atunci cand ne referim la numerele din sirul ramas.
if ((n-p-1)*(n-p)/2 >= m)//Mai am spatiu de permutari.
printf ("%lld ",p);
else
{
printf ("%lld ",p + m - (n-p-1)*(n-p)/2); //p -> numarul care l-as fi pus oricum + m - (n-p-1)(n-p)/2 -> cate combinatii am nevoie - cate voi obtine din restul numerelor in ordine descrescatoare = cu cat maresc numarul. Aceasta marire va mai crea combinatii egale cu marirea (nr se va cupla cu nr sarite).
val_modificata = p + m - (n-p-1)*(n-p)/2;
break;
}
val = n;
for (++p; p <= n; ++p)
{
if (val == val_modificata)
--val;
printf ("%lld ",val);
--val;
}
}
int main()
{
freopen ("farfurii.in","r",stdin);
freopen ("farfurii.out","w",stdout);
scanf ("%lld%lld",&n,&m);
rezolvare();
return 0;
}