Aurel a învăţat la matematică despre şiruri de numere. Fiind curios din fire, el ar vrea acum să ştie câte şiruri crescătoare de numere naturale nenule cu suma elementelor mai mică sau egală cu S
există.
Cerința
Ajutaţi-l pe Aurel să afle câte astfel de şiruri există.
Date de intrare
Fișierul de intrare crescator.in
conține o singură linie pe care se află numărul natural S
.
Date de ieșire
Fișierul de ieșire crescator.out
va conține o singură linie pe care se va scrie numărul de şiruri dorit de Aurel, calculat modulo 700001
.
Restricții și precizări
1 ≤ S ≤ 50.000
- Un şir de numere
a[1] a[2] a[3] ...a[n]
este crescător dacăa[1] ≤ a[2] ≤ a[3] ≤... ≤ a[n]
- Pentru 20% din teste
S ≤ 50
- Pentru 40% din teste
S ≤ 400
- Pentru 60% din teste
S ≤ 6000
Exemplu
crescator.in
4
crescator.out
11
Explicație
Cele 11
şiruri sunt:
1 1 1 1 1 1 1 1 1 1 1 1 2 1 2 1 3 2 2 2 3 4
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 Crescator:
// 100 puncte
#include <cstdio>
#define MOD 700001
#define NMAX 50005
using namespace std;
int C1[2][NMAX], C2[2][NMAX];
int main() {
int s, sq, c1 = 0, p1 = 1, c2 = 0, p2 = 1;
freopen("crescator.in", "r", stdin);
freopen("crescator.out", "w", stdout);
scanf("%d", &s);
for (sq = 2; sq * sq <= s; ++sq);
C1[0][0] = 1;
for (int i = 1; i < sq; ++i) {
c1 = 1 - c1; p1 = 1 - p1;
for (int j = 0; j <= s; ++j) {
C1[c1][j] = C1[p1][j];
if (j >= i)
C1[c1][j] = (C1[c1][j] + C1[c1][j - i]) % MOD;
}
}
for (int j = 1; j <= s; ++j)
C1[c1][j] = (C1[c1][j] + C1[c1][j - 1]) % MOD;
int ans = C1[c1][s] - 1;
if (ans < 0)
ans += MOD;
C2[0][0] = 1;
for (int i = 1; i < sq; ++i) {
c2 = 1 - c2; p2 = 1 - p2;
for (int j = 0; j <= s; ++j) {
C2[c2][j] = C2[p2][j - 1];
if (j >= i)
C2[c2][j] = (C2[c2][j] + C2[c2][j - i]) % MOD;
int r = s - j - i * (sq - 1);
if (r >= 0)
ans = (ans + (long long) C2[c2][j] * C1[c1][r]) % MOD;
}
}
printf("%d\n", ans);
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 #1646 Crescator
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1646 Crescator 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!