În matematică factorialul unui număr natural nenul K
este notat cu K!
și este egal cu produsul numerelor naturale nenule mai mici sau egale cu K
.
Exemple:
1! = 1
2! = 1•2 = 2
3! = 1•2•3 = 6
…
K! = 1•2•3•...•K
.
Orice număr natural N
poate fi descompus cu ajutorul numerelor factoriale astfel:
N = 1! • f[1] + 2! • f[2] + 3! • f[3] + ... + m! • f[m]
unde coeficienții f[i]
, cu 1 ≤ i ≤ m
sunt numere naturale și în plus f[m] ≠ 0
.
Exemple:
20 = 1!•20
;
20 = 1!•6 + 2!•4 + 3!•1
;
20 = 1!•0 + 2!•1+ 3!•3
;
Dintre toate aceste descompuneri posibile există o singură descompunere, numită descompunere în bază factorială care respectă suplimentar condițiile 0 ≤ f[i] ≤ i
, cu 1 ≤ i < m
și 0 < f[m] ≤ m
.
Exemple:
6 = 1!•0 + 2!•0 + 3!•1
;
17 = 1!•1+ 2!•2 + 3!•2
;
119 = 1!•1+ 2!•2 + 3!•3+ 4!•4
;
Cerința
1. Să se determine descompunerea în bază factorială a unui număr natural X
dat.
2. Cunoscând o descompunere oarecare a unui număr natural Y
să se determine descompunerea în bază factorială a acestuia.
Date de intrare
Fișierul de intrare este bazaf.in
. Acesta conţine pe primul rând un număr natural V
care poate avea doar valorile 1
sau 2
cu următoarea semnificație:
- dacă valoarea lui V
este 1
, pe a doua linie a fișierului de intrare se găsește un număr natural X
cu semnificația de mai sus;
- dacă valoarea lui V
este 2
, pe a doua linie a fișierului de intrare se găsește o descompunere a unui număr Y
sub forma unui șir de valori naturale în care primul termen este m
, urmat de m
valori f[i], care respectă condițiile f[i] ≥ 0
, cu 1 ≤ i < m
și f[m] ≠ 0
, despărțite prin câte un spațiu, cu semnificația de mai sus.
Date de ieșire
Fișierul de ieșire este bazaf.out
. Dacă valoarea V
este 1
atunci fișierul de ieșire va conţine descompunerea în baza factorială a numărului X
iar dacă valoarea V
este 2
atunci fișierul de ieșire va conține descompunerea în baza factorială
a numărului Y
.Descompunerea în bază factorială presupune scrierea în fișierul de ieșire a unei singure linii sub forma unui șir de valori naturale în care primul termen este m
,urmat de m
valori f[i]
, care respectă condițiile 0 ≤ f[i] ≤ i
, cu 1 ≤ i < m
și 0 < f[m] ≤ m
, despărțite prin câte un spațiu, având semnificația de mai sus.
Restricții și precizări
2 ≤ X ≤ 10
15
1 < m ≤ 100 000
0 ≤ f[i] ≤ 10
9
- Pentru rezolvarea corectă a primei cerință se va acorda
30%
din punctaj, iar pentru cea de-a doua cerință se va acorda70%
din punctaj.
Exemplul 1:
bazaf.in
1 17
bazaf.out
3 1 2 2
Explicație
V = 1
, deci se rezolvă doar prima cerință. X = 17
. Descompunerea numărului X = 17
în bază factorială conține trei termeni și este formată din coeficienții 1
, 2
, 2
(17 = 1!•1+2!•2+3!•2
);
Exemplul 2:
bazaf.in
2 2 10 5
bazaf.out
3 0 1 3
Explicație
V = 2
, deci se rezolvă doar a doua cerință Descompunerea 2 10 5
este o descompunere cu 2
termeni având coeficienții 10, 5
și corespunde numărului Y = 20
. Descompunerea în bază factorială a numărului Y = 20
va fi 3 0 1 3
(20 = 1!•0+2!•1+3!•3
).
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema bazaf:
// student Posdarascu Daniel
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cassert>
using namespace std;
#define NMAX 100005
long long n;
int v[NMAX], p;
void findBazaFactoriala(long long n) {
long long fact = 1, k;
for(k = 1; ; k++) {
if(fact * (k + 1) > n)
break;
fact *= (k + 1);
}
vector<int> answer;
for(; k >= 1; k--) {
answer.push_back(n / fact);
n %= fact;
fact /= k;
}
int lim = answer.size();
printf("%d ", lim);
for(int i = lim - 1; i >= 0; i--)
printf("%d ", answer[i]);
printf("\n");
}
void solve1() {
scanf("%lld",&n);
assert(1 <= n && n <= 1LL * 1000000000000000);
findBazaFactoriala(n);
}
void solve2() {
scanf("%lld",&n);
assert(1 <= n && n <= 100000);
for(int i = 1; i <= n; i++) {
assert(0 <= v[i] && v[i] <= 1000000000);
scanf("%d",&v[i]);
}
for(long long i = 1; i <= n || v[i] > 0; i++) {
v[i + 1] += v[i] / (i + 1);
v[i] %= (i + 1);
n = max(n, i);
}
printf("%lld ", n);
for(int i = 1; i <= n; i++) {
printf("%d ", v[i]);
}
printf("\n");
}
int main () {
freopen("bazaf.in","r",stdin);
freopen("bazaf.out","w",stdout);
scanf("%d", &p);
assert(1 <= p && p <= 2);
if(p == 1) {
solve1();
}
else {
solve2();
}
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2457 bazaf
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2457 bazaf de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!