Informatică, întrebare adresată de justdeea11, 8 ani în urmă

Cerinţă
Se dau 2 numere naturale, a şi b. Să se determine dacă a se poate scrie că suma de b numere naturale consecutive.

Date de intrare
Programul citeşte de la tastatură cele 2 numere a şi b.

Date de ieşire
Programul va afişa pe ecran numărul mesajul DA dacă a se poate scrie că suma de b numere naturale, iar NU în caz contrar.

Restricţii şi precizări
1 ≤ a ≤ 100.000.000
1 ≤ b ≤ 25.000

cu explicatie plss

Răspunsuri la întrebare

Răspuns de andrei750238
7

Cod C++ :

#include <iostream>

using namespace std;

int main()

{

   int a, b;

cin >> a >> b;

if ((a - ((b - 1)*b / 2)) % b == 0) cout << "DA";

   else cout << "NU";

   return 0;

}

Explicatie :

Fie n primul numar din suma respectiva de b numere naturale consecutive

Numerele vor fi de tipul : n, n+1, n+2, n+3, ..... n+b-1

Deci suma (adica a) este n+ n+1 + n+2 + .... +n+b-1.

Daca dam factor comun n => a = b*n + 1+2+3+....+b-1

Observam ca  1+2+3+...+b-1 este o suma gauss. Deci 1+2+3+...+b-1 = \frac{(b-1)*b}{2}

Astfel suma devine :

a =  b*n + \frac{(b-1)*b}{2}

unde b,n si a sunt numere naturale.

Daca aplicam acest rationament invers inseamna ca a poate fi scris ca suma de b numere naturale consecutive daca n este numar natural.

Daca scoate n din relatia de mai sus :

n=(a-(b-1)*b/2)/b

Ca sa verificam daca acest numar n este natural trebuie sa verificam daca a - (b-1)*b/2 este divizibil cu b. De aici rezulta conditia pe care o folosim in program (a - (b * (b - 1) / 2)) % b == 0)

Anexe:
Alte întrebări interesante