Cod sursa(job #1245427)

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

using namespace std;

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

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

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

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

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

            if (here + margin < lowerBound) {
                isGood = false;
                break;
            }

            if (here < lowerBound) {
                start += (lowerBound - here);
                margin -= (lowerBound - here);
            } else if (here + margin > upperBound) {
                margin -= here + margin - upperBound;
            }
        }
        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;
}