Cod sursa(job #1092471)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 27 ianuarie 2014 04:40:36
Problema Progresie Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.28 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.x - 1) + 1;
     
	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;
}