Cod sursa(job #1245410)

Utilizator OwlreeRobert Badea Owlree Data 19 octombrie 2014 10:29:16
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.7 kb
#include <bits/stdc++.h>

using namespace std;

long long solve(long long N, long long R) {

    for (long long k = 1;; ++k) {
        long long start = k * k - k + 1;
        long long margin = k - 1;

        bool isGood = true;
        for (long long i = 1; i < N; ++i) {
            long long here = start + R * i;

            long long floorSqrt = sqrt(here);
            long long ceilSqrt  = floorSqrt + 1;
            if (floorSqrt * floorSqrt == here) {
                ceilSqrt = floorSqrt;
            }

            long long upperBound = ceilSqrt * ceilSqrt;
            long long lowerBound = upperBound - ceilSqrt + 1;

            // if it fits
            if (lowerBound <= here && here <= upperBound) {
                margin = min(margin, upperBound - here);
            } else {
                if (margin == 0) {
                    isGood = false;
                    break;
                }

                long long nextUpperBound = (ceilSqrt + 1) * (ceilSqrt + 1);
                long long nextLowerBound = nextUpperBound - (ceilSqrt + 1);

                // here + X = nextLowerBound, X = nextLowerBound - here
                long long X = nextLowerBound - here;

                if (X > margin) {
                    isGood = false;
                    break;
                }

                start += X;
                margin -= X;
            }
        }
        if (isGood) {
            return start;
        }
    }

}

int main() {

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

    int T = 0;
    in >> T;
    for (int i = 0; i < T; ++i) {
        int N, R;
        in >> N >> R;
        out << solve(N, R) << "\n";
    }

    in.close();
    out.close();

    return 0;
}