######################################### from collections import deque class Convex_Hull_Trick(): #https://tjkendev.github.io/procon-library/python/convex_hull_trick/deque.html #追加する傾きが単調減少かつqueryのxが単調増加 #単調性なしが良いならこちらへ(queryのxは先読み) https://judge.yosupo.jp/submission/30579 def __init__(self): self.deq=deque() def check(self,f1, f2, f3): return (f2[0] - f1[0]) * (f3[1] - f2[1]) >= (f2[1] - f1[1]) * (f3[0] - f2[0]) def f(self,f1, x): return f1[0] * x + f1[1] # add f_i(x) = a*x + b def add_line(self,a, b): f1 = (a, b) while len(self.deq) >= 2 and self.check(self.deq[-2], self.deq[-1], f1): self.deq.pop() self.deq.append(f1) # min f_i(x) def query(self,x): while len(self.deq) >= 2 and self.f(self.deq[0], x) >= self.f(self.deq[1], x): self.deq.popleft() return self.f(self.deq[0], x) ################################## def sol1(X,A): #O(A) ans = 2 ** 63 for k in range(1, A + 1): cnt1 = k - A % k cnt2 = A % k res = cnt1 * ((A // k)**2) + cnt2 * ((A // k + 1)**2) + X * k ans = min(ans, res) return ans def sol2(X,A): #O(A) dp=[2**63]*(A+1) dp[0]=0 cht=Convex_Hull_Trick() cht.add_line(0,0) for i in range(1,A+1): dp[i]=cht.query(i)+i**2+X cht.add_line(-2*i,dp[i]+i**2) return dp[A] def sol3(X,A): #O(√A) R=A ans=2**63 while R: q=A//R L=A//(q+1)+1 def f(k): return k*(q**2)+(A-q*k)*(2*q+1)+X*k ans=min(ans,f(L),f(R)) R=L-1 return ans T=int(input()) for iii in range(T): X,A=map(int,input().split()) print(sol2(X,A)) from random import randrange as rd cnt=0 while 0: cnt+=1 print(cnt) X=rd(100) A=rd(1,10**4) ans1=sol1(X,A) ans2=sol2(X,A) ans3=sol3(X,A) if not(ans1==ans2==ans3): print(X,A) exit()