Fie n un număr natural nenul, n > 1. Definim n(p) ca fiind descompunerea lui n în sumă de puteri naturale distincte ale numărului prim p.
Exemple:
- pentru
n=10toaten(p)descompunerile posibile sunt:10(2)=21+23şi10(3)=30+32 - pentru
n=11toaten(p)descompunerile posibile sunt:11(2)=20+21+23şi11(11)=111
Cerința
Să se scrie un program care citeşte un număr natural n şi determină toate n(p) descompunerile numărului n.
Date de intrare
Fișierul de intrare desc.in conține pe prima linie numărul n.
Date de ieșire
Fișierul de ieșire desc.out va conține pe linii separate toate n(p) descompunerile numărului n. Fiecare linie va conţine în ordine:
- o valoare naturală
preprezentând numărul prim asociat descompunerii; - o valoare naturală
k, reprezentând numărul de termeni ai descompunerii; - Următoarele
kvalori, numere naturale, reprezintă exponenţii puterilor din descompunere, scrise în ordine crescătoare.
Restricții și precizări
2 ≤ n ≤ 10 000 000- Pentru un număr prim
pfixat, există o singurăn(p)descompunere a unui număr naturaln; - Descompunerile vor fi afişate în ordinea crescătoare a valorilor identificate pentru
p; - Pe fiecare linie a fişierului de ieşire, valorile vor fi despărţite prin câte un spaţiu.
Exemplu
desc.in
10
desc.out
2 2 1 3 3 2 0 2
Explicație
10(2)=21+23; 10(3)=30+32. Prima descompunere s-a făcut după numărul prim p=2 şi conţine 2 termeni cu puterile 1 şi 3. A doua descompunere s-a făcut după numărul prim p=3 şi conţine 2 termeni cu puterile 0 şi 2.
Exemplu
desc.in
11
desc.out
2 3 0 1 3 11 1 1
Explicație
11(2)=20+21+23; 11(11)=111. Prima descompunere s-a făcut după numărul prim p=2 şi conţine 3 termeni cu puterile 0, 1 şi 3. A doua descompunere s-a făcut după numărul prim p=11 şi conţine un termen cu puterea 1.
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 desc:
// varianta iterativa cu calculare factori crescator numai pana la n/2 plus n-1 si n
#include <stdio.h>
#include <math.h>
#define nmax 10000001
using namespace std;
FILE *f = fopen("desc.in","r");
FILE *g = fopen("desc.out","w");
char v[nmax];
int w[nmax/5],nr=0;
int eprim(int x)
{
int d=0,i;
for(i=2;i*i<=x;i++)
if (x%i==0) d++;
if (d==0) return x;
else return 0;
}
// Ciurul lui Eratostene
void ciur(int n)
{
int i, j;
for (i = 2; i <= n; ++i) {
if (v[i] == 0) {
w[++nr]=i;
for (j = i + i; j <= n; j += i) {
v[j] = 1;
}}}
}
void solve(int q,int prim)
{
bool ok=true;
int i,k=0,fact,x[25];
x[0]=0;
while (q>1&&ok)
{
fact=0;
while (q%prim==0)
{fact++;q/=prim;}
if (k>0&&!fact) ok = false;
x[k+1]=fact+x[k];
k++;q--;
}
if (ok&&!q)
{
fprintf(g,"%d %d ",prim,k);
for(i=1;i<=k;i++)
fprintf(g,"%d ",x[i]);
fprintf(g,"
");
}
}
int main()
{
int i,q;
fscanf(f,"%d",&q);
ciur((int)sqrt(q));
if (eprim(q-1)) w[++nr]=q-1;
if (eprim(q)) w[++nr]=q;
for(i=1;i<=nr;i++)
solve(q,w[i]);
fclose(f);
fclose(g);
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 #711 desc
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #711 desc 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!