O culegere de probleme are P pagini, numerotate de la 1 la P. Problemele din culegere sunt numerotate cu 1,2,3,...,etc, în ordinea apariţiei lor în culegere. Pe prima pagină a culegerii este scrisă o singură problemă (cea cu numărul 1). Pe a doua pagină sunt scrise exact două probleme (cele cu numerele 2 şi 3, în această ordine). Pe cea de-a treia pagină sunt scrise exact trei probleme (cele cu numerele 4, 5 şi 6, în această ordine),…, pe cea de a P-a pagină sunt scrise exact P probleme.
Cerința
Scrieţi un program care citeşte numerele naturale P şi N şi determină valorile:
a) T, numărul total de cifre care au fost utilizate în numerotarea tuturor problemelor din culegere;
b) M, numărul minim de pagini pe care ar trebui să le aibă culegerea, astfel încât aceasta să conţină şi problema numerotată cu N.
Date de intrare
Fişierul culegere.in conţine pe prima linie cele două numere naturale P şi N, separate printr-un spaţiu, cu semnificaţia din enunţ.
Date de ieșire
Fişierul culegere.out conţine:
pe prima linie numărul natural T, cu semnificaţia din enunţ;
pe a doua linie numărul natural M, cu semnificaţia din enunţ.
Restricții și precizări
1 ≤ P ≤ 16000
1 ≤ N ≤ 2112600000
Răspunsuri la întrebare
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("culegere.in");
ofstream g("culegere.out");
long long p, n, t, m, a, b, ult,i, z1;
int main()
{
f >> p >> n;
if (p%2) a=((p-1)/2)*p+1;
else a=(p/2)*(p-1)+1;
b=a+p-1;
ult=b;
long long z=1, nr=1;
while (b>9)
{
z=z*10; ++nr; b/=10;
}
b=ult;
if (b<10) t=b;
else
{
i=2; z1=90; t=0;
while (i<nr)
{
t=t+i*z1;
z1*=10; ++i;
}
t=9+t+(ult-z+1)*nr;
}
if (n==1) { m=1; }
else
{
b=0; m=0;
while (n>b)
{
++m; b+=m;
}
}
g << t << "\n";
g << m;
return 0;
}
prin a am aflat primul numar din ultima linie si prin b - ultimul numar din ultima linie