Cod sursa(job #1092470)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 27 ianuarie 2014 04:24:59
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.15 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cmath>
#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair <int, int>
#define pll pair <ll, ll>
#define x first
#define y second
using namespace std;
pll sol, curr;
int tests, n, r;

inline int inters(ll l1, ll r1, ll l2, ll r2)
{
	return !(l1 > r2 || l2 > r1);
}

inline int check(int left)
{
	if (left == 0)
		return 1;
	
	pll intv = mp(sol.x + r, sol.y + r);
	int idx = (int)sqrt(intv.y - 1) - 1;
	
	for (int i = 0; i < 2; i++)
	{
		idx++;
		curr = mp((ll)(idx - 1) * idx + 1, (ll)idx * idx);
		if (inters(intv.x, intv.y, curr.x, curr.y))
		{
			curr.x = max(intv.x, curr.x);
			curr.y = min(intv.y, curr.y);
			sol = curr;
			return check(left - 1);
		}
	}
	
	return 0;
}

int main()
{
	freopen("progresie.in", "r", stdin);
	freopen("progresie.out", "w", stdout);
	scanf("%d", &tests);
	while (tests--)
	{
		scanf("%d%d", &n, &r);
		
		int i = 2;
		sol = mp((ll)(i - 1) * i + 1, (ll)i * i);
		
		for (int i = 1; ; i++)
		{
			sol = mp((ll)(i - 1) * i + 1, (ll)i * i);
			
			if (check(n - 1))
			{
				printf("%lld\n", sol.x - (ll)(n - 1) * r);
				break ;
			}
		}
	}
	return 0;
}