Cod sursa(job #1140655)

Utilizator alex23alexandru andronache alex23 Data 12 martie 2014 10:08:44
Problema Progresie Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.94 kb
//#define _CRT_SECURE_NO_DEPRECATE
//#include <cstdio>
//#include <cmath>
//
//long long T, N, R;
//
//int main()
//{
//	freopen("progresie.in", "r", stdin);
//	freopen("progresie.out", "w", stdout);
//
//	scanf("%lld", &T);
//	while (T--)
//	{
//		scanf("%lld %lld", &N, &R);
//
//		for (int i = 0;; ++i)
//		{
//			long long start = i * (i + 1) + 1;
//			long long margin = i;
//			bool isSol = true;
//
//			for (int j = 1; j < N; ++j)
//			{
//				long long start_t = start + j * R;
//				long long end_t = start_t + margin;
//				long long r = sqrt(start_t - 1);
//				long long start_i = r * (r + 1) + 1;
//				long long end_i = (r + 1) * (r + 1);
//				if (end_t < start_i)
//				{
//					isSol = false;
//					break;
//				}
//				if (start_t < start_i)
//				{
//					start += start_i - start_t;
//					margin -= start_i - start_t;
//				}
//				else if (end_t > end_i)
//				{
//					margin -= end_t - end_i;
//				}
//			}
//			if (isSol)
//			{
//				printf("%lld\n", start);
//				break;
//			}
//		}
//	}
//
//	return 0;
//}


#include <fstream>
#include <cmath>
using namespace std;

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

int T, N, R;

long long solve(int N, int R) {
	for (int i = 0;; ++i) {
		long long start = 1LL * i * (i + 1) + 1;
		long long margin = i;
		int isOK = 1;

		for (int it = 1; it < N; ++it) {
			long long low = start + 1LL * it * R;
			long long high = low + margin;
			int j = (int)sqrt(low - 1);
			long long lowi = 1LL * j * (j + 1) + 1;
			long long highi = 1LL * (j + 1) * (j + 1);

			if (high < lowi) {
				isOK = 0;
				break;
			}

			if (low < lowi) {
				start += lowi - low;
				margin -= lowi - low;
			}
			else if (high > highi)
				margin -= high - highi;
		}

		if (isOK)
			return start;
	}
}

int main() {
	fin >> T;
	for (int t = 1; t <= T; ++t) {
		fin >> N >> R;

		fout << solve(N, R) << "\n";
	}
}