Rezolvare completă PbInfo #1646 Crescator

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 Adresa de email.

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!