Cod sursa(job #1057748)

Utilizator SpiderManSimoiu Robert SpiderMan Data 14 decembrie 2013 19:03:19
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.39 kb
# include <cstdio>
# include <cmath>

const char *FIN = "progresie.in", *FOU = "progresie.out";

int N, R, T;

inline bool isint(double val) {
    return val == static_cast <int> (val);
}

inline int cauta(int x) {
    int delta = 1 + 8*x;
    double rad = sqrt(delta);
    double n1 = (-1 - rad) * 0.5, n2 = (-1 + rad) * 0.5;
    return static_cast <int> (n2);
}

inline bool is(int val) {
    int n = cauta((val - 1) >> 1) + 1;
    int first_elem = n * (n - 1) + 1;
    return val < n + first_elem;
}

inline bool check (int val) {
    val += R;
    for (int i = 1; i < N; ++i, val += R) {
        if (!is(val)) return 0;
    }
    return 1;
}

inline int minim(int a, int b) {
    for (int i = a; i < b; ++i)
        if (check (i)) return i;
    return b;
}

inline int solve() {
    int sol = -1;
    for (int st = 1, dr = 15000; st <= dr; ) {
        int mij = st + (dr - st) / 2;
        //printf ("%d\n", mij);
        if (check (mij * (mij - 1) + 1)) sol = mij * (mij - 1) + 1, dr = mij - 1;
        else if (check (mij * (mij - 1) + mij)) sol = minim(mij * (mij - 1) + 2, mij * (mij - 1) + mij), dr = mij - 1;
        else st = mij + 1;
    }
    return sol;
}

int main (void) {
    freopen (FIN, "r", stdin);
    freopen (FOU, "w", stdout);

    for (scanf ("%d", &T); T; --T) {
        scanf ("%d %d", &N, &R);
        printf ("%d\n", solve());
    }
}