Pagini recente » Cod sursa (job #1886352) | Cod sursa (job #2822408) | Cod sursa (job #2375552) | Cod sursa (job #687906) | Cod sursa (job #2220027)
#include <fstream>
#include <math.h>
#define LL long long
using namespace std;
fstream f1("progresie.in", ios::in);
fstream f2("progresie.out", ios::out);
int t;
long long n, r;
long long v(long long n, long long r)
{
int ok;
long long k, j, dec, nr, st, dr, rad;
///k- numar bloc
///dec- decalajul fata de prima valoare din bloc (valoarea cu care poti muta la dreapta toata secventa)
///nr- termen curent progresie
///st, dr -marigini bloc curent
for(k=1LL; ;k++)
{
nr=k*(k-1LL)+1LL; dec=k-1LL; ///dec daca st s-ar muta pe dr
ok=1;
for(j=1LL; (j<n)&&ok; j++)
{
nr+=r; rad=sqrt(nr); if(rad*rad!=nr) rad++;
st=rad*(rad-1LL)+1LL; dr=rad*rad;
if(st<=nr) dec=min(dec, dr-nr); ///actualizezi decalajul maxim la dr
else
{
if(nr+dec>=st) ///daca poti muta secventa la dr a.i. nr sa pice in interiorul urmatorului bloc pe prima poz, o faci
{
dec-=(st-nr);
nr=st;
}
else ok=0;
}
}
if(ok) return nr-r*(n-1LL);
}
}
int main()
{
f1>>t;
while(t--)
{
f1>>n>>r;
f2<<v(n, r)<<"\n";
}
return 0;
}