Informatică, întrebare adresată de stassahul, 9 ani în urmă

Cerința
Se dau n și k numere naturale. Calculați suma resturilor împărțirii tuturor numerelor naturale de la 1 la n prin numărul k.

Date de intrare
Programul citește de la tastatură numerele n și k, separate prin spațiu.

Date de ieșire
Programul va afișa pe ecran numărul S, reprezentând suma resturilor împărțirii tuturor numerelor naturale de la 1 la n prin numărul k.

Restricții și precizări
1 ≤ n , k ≤ 2.000.000.000

Exemplu
Intrare

7 4
Ieșire

12
Explicație
Împărțind numerele de la 1 la 7 prin 4 obținem resturile: 1,2,3,0,1,2,3. Suma lor este 12.

Ce am gresit la programul meu, in formula, ca i-au 80pcte pe pbinfo?!
#include

using namespace std;

unsigned long long n,k,S,r;

int main ()

{

cin >> n >> k;

if(n<=k) S+=k*(k-1)/2;
else
{
if(n%k==0) r=n/k;
else r=n/k+1;
S=(r-1)*(k*(k-1)/2);
if(n%k==0) S+=k*(k-1)/2;
else S+=(n%k)*(n%k+1)/2;

}

cout << S;

return 0;
}

Numi scrieti programe de 100pcte!!!! Vor fi raportate!!! Trebuie sami stiu greseala.

Răspunsuri la întrebare

Răspuns de Razzvy
10
#include <iostream>
using namespace std;

/*am folosit o formula directa pentru calcul
  prima parte este: (n / k) * (k * (k - 1) / 2). Noi stim ca resturile progreseaza de la 0 la k - 1, astfel daca ar fi sa calculam suma tuturor acestor resturi, ar fi 0 + 1 + 2 + ... + (k - 1) = k * (k - 1) / 2 (Suma Gauss). Stim ca aceasta secventa completa de resturi apare de n / k ori

A doua parte a formulei este (n % k) * (n % k + 1) / 2 , care calculeaza suma resturilor ramase. Aceasta formula provine tot de la suma Gauss.
*/
int main()
{
   int n,k;
   cin>>n>>k;
   cout<<(n/k)*(k*(k-1)/2)+(n%k)*(n%k+1)/2;
}


stassahul: Mersi desigur, dar formula asta o pot vedea si in solutia oficiala, in primul rind, in al doilea am scris ca trebuie sami gasesc greseala!
Razzvy: Imi cer scuze. Am crezut ca problema a fost rezolvata in primul raspuns. Greseala ta este la primul if(n<=k), trebuia sa fie S+=n*(n+1)/2, nu k*(k-1)/2
stassahul: Mersi!!!! Scuze ca tiam dat deja raport :(((. Nu stiu cum am scapat greseala asta din vedere :(
Razzvy: Nu-i nimic. Nu m-am uitat pe raspunsul de dinainte, si am crezut ca s-au rezolvat lucrurile. Voiam doar sa iti dau o rezolvare mai scurta :)
Alte întrebări interesante