Numărul 1
poate fi scris în diverse moduri ca sumă de fracţii cu numărătorul 1
şi numitorul o putere a lui 2
. De exemplu:
1 = 1/2 + 1/2 = 1/2 + 1/4 + 1/8 + 1/8 = 1/8 + 1/4 + 1/2 + 1/8
Două scrieri nu sunt considerate distincte dacă folosesc aceleaşi fracţii scrise în altă ordine. În exemplul de mai sus ultimele două scrieri nu sunt distincte.
Cerinţă
Pentru N
– număr natural nenul să se determine:
a) O modalitate de scriere a numărului 1
ca sumă de exact N
fracţii cu numărătorul 1
şi numitorul o putere a lui 2
.
b) Numărul de scrieri distincte a numărului 1
ca sumă de exact N
fracţii cu numărătorul 1
şi numitorul o putere a lui 2
. Deoarece acest număr poate fi foarte mare acest număr trebuie calculat modulo 100003
.
Date de intrare
Fişierul de intrare fractii2.in
conţine pe prima linie un număr natural p
. Pentru toate testele de intrare, numărul p
poate avea doar valoarea 1
sau valoarea 2
.
Pe a doua linie se găseşte un singur număr N
natural – reprezentând numărul de fracţii
Date de ieşire
Dacă valoarea lui p
este 1
, se va rezolva numai punctul a)
din cerinţă. În acest caz, în fişierul de ieşire fractii2.out
se vor scrie, pe o singură linie, N
numere naturale separate prin câte un spaţiu reprezentând cei N
exponenţi ai lui 2
din scrierea solicitată în prima cerinţă. Astfel, dacă numerele afişate sunt \( m_1, m_2, …, m_n\) atunci există scrierea \( 1= {1 \over {2^{m_1}}} + {1 \over {2^{m_2}}} + … + {1 \over {2^{m_n}}}\) .
Dacă valoarea lui p
este 2
, se va rezolva numai punctul b)
din cerinţă. În acest caz, în fişierul de ieşire fractii2.out
se va scrie un număr natural reprezentând răspunsul la a doua cerinţă, adică numărul de scrieri distincte a numărului 1
ca sumă de N
fracţii cu numărătorul 1
şi numitorul o putere a lui 2
(modulo 100003
).
Restricţii
2 ≤ N ≤ 2000
- Pentru prima cerinţă se acordă
20%
din punctaj. - Pentru a doua cerinţă de acordă
80%
din punctaj. - Rezultatul pentru a doua cerinţă trebuie afişat modulo
100003
Exemplul 1
fractii2.in
1 4
fractii2.out
2 2 2 2
Exemplul 2
fractii2.in
2 4
fractii2.out
2
Explicaţie
Primul exemplu:
1 = 1/2 + 1/4 + 1/8 + 1/8 = 1/4 + 1/4 + 1/4 + 1/4
Răspunsul corespunde celei de-a doua scrieri dar există şi alte variante corecte de răspuns. De exemplu, 3 1 2 3
se consideră răspuns corect.
Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa a).
Al doilea exemplu:
1 = 1/2 + 1/4 + 1/8 + 1/8 = 1/4 + 1/4 + 1/4 + 1/4
Acestea sunt singurele scrieri distincte.
Atenţie! Pentru acest test se va afişa doar rezultatul la cerinţa b).
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 Fractii2:
#include <cstdio>
#include <algorithm>
#define MOD 100003
#define N 2002
using namespace std;
int n,i,j,k,m,cod,U[N],D[N][N];
int main()
{
freopen("fractii2.in","r",stdin);
freopen("fractii2.out","w",stdout) ;
scanf("%d%d",&cod,&n);
if(cod==1)
{
for(i=1;i<n;i++)printf("%d ",i);printf("%d\n",n-1);
return 0;
}
n-=2;
U[n+1]=2;
for(i=n+1;i>=2;i--)
for(m=U[i],j=1;j<=m;j++)
U[i-j]=max(U[i-j],min(2*j,i-j));
D[0][0]=D[1][1]=1;
for(i=2;i<=n;i++)
{
m=U[i];
for(j=1;j<=m;j++)
{
k=min(2*j,i-j);
D[i][j]=D[i][j-1]+D[i-j][k]>=MOD?D[i][j-1]+D[i-j][k]-MOD:D[i][j-1]+D[i-j][k];
}
}
printf("%d",D[n][2]);
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 #1022 Fractii2
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1022 Fractii2 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!