Cod sursa(job #1451305)

Utilizator Al3ks1002Alex Cociorva Al3ks1002 Data 16 iunie 2015 19:25:04
Problema Progresie Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("progresie.in");
ofstream fout("progresie.out");

#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second

ll t, n, r, i, isOk, block, cand, margin, where, myStart, myEnd, goodStart, goodEnd;

ll getBlock(ll x) {
	return 1 + (int)sqrt(x - 1);
}

ll first(ll block) {
	return block * (block - 1) + 1;
}

ll last(ll block) {
	return block * block;
}

int main() {

	fin >> t;
	for (; t; t--) {
		fin >> n >> r;

		for (block = 1;; block++) {
			cand = first(block);
			margin = block - 1;
			isOk = 1;

			for (i = 1; i < n; i++) {
				myStart = cand + r * i;
				myEnd = myStart + margin;

				where = getBlock(myStart);

				goodStart = first(where);
				goodEnd = last(where);

				if (myEnd < goodStart) {
					isOk = 0;
					break;
				}

				if (myStart < goodStart) {
					margin -= goodStart - myStart;
					cand += goodStart - myStart;
				} else if (myEnd > goodEnd)
					margin -= myEnd - goodEnd;
			}

			if (isOk) {
				fout << cand << '\n';
				break;
			}
		}
	}

	return 0;
}