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
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 =
Astfel suma devine :
a =
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)