Cod sursa(job #2240002)

Utilizator LolkekzorChiorean Tudor Lolkekzor Data 12 septembrie 2018 09:52:51
Problema Progresie Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.3 kb
#include <fstream>
#include <cmath>
using namespace std;

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

int64_t tc, n, r, group, crtPos, crtGrp, m, i;
bool ok;

int64_t crtGroup(int64_t x) {
    return (int64_t)sqrt(x - 1.0) + 1;
}

pair<int64_t, int64_t> grpLims(int64_t grp) {
    return make_pair(grp * grp - grp + 1, grp * grp);
}

int main()
{
    fin >> tc;

    while(tc--) {
        fin >> n >> r;

        group = 0;
        while(1) {
            group ++;
            crtPos = grpLims(group).first;
            crtGrp = group;

            m = group - 1;
            ok = 1;
            for (i = 2 ; i <= n ; i++) {
                crtPos += r;
                if (crtPos > grpLims(crtGrp).second) {
                    crtGrp++;
                    if (grpLims(crtGrp).first - crtPos <= m) {
                        m -= crtPos - grpLims(crtGrp).first;
                        crtPos = grpLims(crtGrp).first;
                    } else {
                        ok = 0;
                        break;
                    }
                }

                m = min(m, grpLims(crtGrp).second - crtPos);
            }

            if (ok) {
                fout << crtPos - (n - 1) * r << '\n';
                break;
            }
        }
    }
}