Numerele naturale nenule se scriu pe linii într-un triunghi de forma de mai jos:
1 2 3 4 5 6 7 8 9 10 ...
Cerința
Se dau două numere natural n
și m
. Determinați:
1. Suma numerelor de pe linia cu numărul n
din triunghiul construit ca mai sus.
2. Linia pe care se află numărul m
, precum și pe ce poziție se află el pe această linie.
Date de intrare
Fișierul de intrare numere18.in conține pe prima linie un număr natural C
reprezentând cerința din problemă care trebuie rezolvată (1 sau 2).
Dacă C
este egal cu 1
, a doua linie din fișier conține un număr natural n
, reprezentând numărul liniei pe care trebuie să se calculeze suma.
Dacă C
este egal cu 2
, a doua linie din fișier conține numărul natural m
, reprezentând numărul care trebuie căutat în triunghi.
Date de ieșire
Fișierul de ieșire numere18.out
va conține o singură linie. Dacă C=1
, va fi scrisă suma cerută la punctul 1. Dacă C=2
, vor fi scrise nouă numere: linia pe care a află numărul m
, respectiv poziția acestuia pe această linie, separate printr-un spațiu.
Restricții și precizări
1 ≤ n ≤ 1000
1 ≤ m ≤ 1.000.000.000
- Pentru rezolvarea corectă a cerinţei 1 se acordă 45 de puncte; pentru rezolvarea corectă a cerinței 2 se acordă 55 de puncte.
Exemplul 1:
numere18.in
1 4
numere18.out
34
Explicație
În acest caz se rezolvă doar cerința 1
. Numerele de pe linia a 4-a sunt: 7, 8, 9, 10
, iar suma lor este 34
Exemplul 2:
numere18.in
2 9
numere18.out
4 3
Explicație
În acest caz se rezolvă doar cerința 2
. Numărul 9
se află pe linia 4
, iar poziția lui este 3
.
#include <bits/stdc++.h> using namespace std; ifstream istr ("numere18.in"); ofstream ostr ("numere18.out"); int main () { int n,m,c; istr >> c; int x=1; if (c == 1) { istr >> n; int s=0, a = n * (n - 1)/2 , b = n * (n + 1)/2; for (int i = a + 1; i <= b ; ++i) s=s+i; ostr << s; } if (c == 2) { istr >> m; int k=1; while (k * (k + 1)/2 < m) k++; k--; ostr << k+1<< ' ' << m - k* (k+1)/2; } istr.close (); ostr.close (); return 0; }