Cod sursa(job #1092468)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 27 ianuarie 2014 03:54:15
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.23 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;
vector <pll> sol, curr;
int tests, n, r;

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

inline int check(int left)
{
	if (left == 0)
		return sol.size();
	
	curr.clear();
	for (int i = 0; i < sol.size(); i++)
	{
		pll intv = mp(sol[i].x + r, sol[i].y + r);
		int left = (int)sqrt(intv.x), right = (int)sqrt(intv.y);
		for (int j = left; j <= right; j++)
		{
			if (inters(intv.x, intv.y, (ll)(j - 1) * j + 1, (ll)j * j))
			{
				pll inters;
				inters.x = max(intv.x, (ll)(j - 1) * j + 1);
				inters.y = min(intv.y, (ll)j * j);
				
				curr.pb(inters);
			}
		}
	}
	
	sol = curr;
	return check(left - 1);
}

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