// 非想定解 O(TlogA) ???(自信なし) #include // clang-format off using namespace std;constexpr int INF=1001001001;constexpr long long INFll=1001001001001001001;namespace viewer{using s=string;templates f(T i){s S=i==INF||i==INFll?"inf":to_string(i);return s(max(0,3-int(S.size())),' ')+S;} templateauto v(T&x,s&&e)->decltype(cerr<void v(const pair&p,s&&e="\n"){cerr<<"(";v(p.first,", ");v(p.second,")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),")"+e);}templatevoid v(const tuple&t,s&&e="\n"){cerr<<"(";v(get<0>(t),", ");v(get<1>(t),", ");v(get<2>(t),", ");v(get<3>(t),")"+e);} templatevoid v(const vector&vx,s);templateauto ve(int,const vector&vx)->decltype(cerr<auto ve(bool,const vector&vx){cerr<<"{\n";for(const T&x:vx)cerr<<" ",v(x,",");cerr<<"}\n";}templatevoid v(const vector&vx,s){ve(0,vx);} templatevoid v(const deque&q,s&&e){v(vector(q.begin(),q.end()),e);}templatevoid v(const set&S,s&&e){v(vector(S.begin(),S.end()),e);}templatevoid v(const multiset&S,s&&e){v(vector(S.begin(),S.end()),e);}templatevoid v(const unordered_set&S,s&&e){v(vector(S.begin(),S.end()),e);} templatevoid v(const priority_queue&p,s&&e){priority_queueq=p;vectorz;while(!q.empty()){z.push_back(q.top());q.pop();}v(z,e);}templatevoid v(const map&m,s&&e){cerr<<"{"<<(m.empty()?"":"\n");for(const auto&kv:m){cerr<<" [";v(kv.first,"");cerr<<"] : ";v(kv.second,"");cerr<<"\n";}cerr<<"}"+e;} templatevoid _view(int n,s&S,T&var){cerr<<"\033[1;32m"<void grid(T _){}void grid(const vector>&vvb){cerr<<"\n";for(const vector&vb:vvb){for(const bool&b:vb)cerr<<(b?".":"#");cerr<<"\n";}} void _debug(int,s){}templatevoid _debug(int n,s S,const H&h,const T&... t){int i=0,cnt=0;for(;iap;mint re=a;for(long long r=1;r long double golden_section_search(long double l, long double r, f golden_f) { // 参考 // https://en.wikipedia.org/wiki/Golden-section_search wikipedia // https://nodchip.hatenadiary.org/entry/20090303/1236058357 // 実数探索三種類解説 https://naoyat.hatenablog.jp/entry/2012/01/04/231801 // 三分探索と黄金分割探索 constexpr long double GOLDEN_RATIO = 1.61803398874989484820; constexpr int GSS_MAXLOOP = 300; long double lv = golden_f((l * GOLDEN_RATIO + r) / (1 + GOLDEN_RATIO)); long double rv = golden_f((l + r * GOLDEN_RATIO) / (1 + GOLDEN_RATIO)); for (int _loop_cnt = 0; _loop_cnt < GSS_MAXLOOP; ++_loop_cnt) { if (lv > rv) { r = (l + r * GOLDEN_RATIO) / (1.0 + GOLDEN_RATIO); rv = lv; lv = golden_f((l * GOLDEN_RATIO + r) / (1.0 + GOLDEN_RATIO)); } else { l = (l * GOLDEN_RATIO + r) / (1.0 + GOLDEN_RATIO); lv = rv; rv = golden_f((l + r * GOLDEN_RATIO) / (1.0 + GOLDEN_RATIO)); } } if (lv > rv) r = (l + r * GOLDEN_RATIO) / (1.0 + GOLDEN_RATIO); else l = (l * GOLDEN_RATIO + r) / (1.0 + GOLDEN_RATIO); return (r + l) * 0.5; } int main() { cin.tie(0); ios::sync_with_stdio(false); long long T; cin >> T; assert(1 <= T && T <= 100); while (T--) { long long X, A; cin >> X >> A; assert(0 <= X && X <= 1'000'000'000); assert(1 <= A && A <= 1'000'000'000); // 愚直解 // for (long long c = 1; c <= A; c++) { // long long q = A / c; // long long a = A - c * q; // chmin(ans, (c - a) * q * q + a * (q + 1) * (q + 1) + X * c); // } auto golden_f = [&](long double _c) -> long double { // ここを変える 最小値を求める時は-1.0を掛ける // 単調な場所がある場合は駄目 極小値を飛ばしてしまう long long c = clamp((long long)round(_c), 1ll, A); long long q = A / c; long long a = A - c * q; double ret = (c - a) * q * q + a * (q + 1) * (q + 1) + X * c; return -1.0 * ret; }; long long temp = round(golden_section_search(1.0, A, golden_f)); // 誤差を考慮して±10を見る long long ans = INFll; for (int diff = -10; diff <= 10; diff++) { chmin(ans, (long long)round(-golden_f(temp + diff))); } cout << ans << endl; } return 0; }