Official
G - レベルアップ / Level Up Editorial
by
G - レベルアップ / Level Up Editorial
by
kyopro_friends
この問題はクエリごとに答えを二分探索することにより解けます。
レベル \(0\) のキャラクタをレベル \(X\) に上げるために必要な宝石の個数は \(\sum_{x=0}^{X-1}Ax+B=A\frac{X(X-1)}{2}+BX\) であるため、求める答えは \(A\frac{X(X-1)}{2}+BX \leq N\) を満たす最大の整数 \(X\) です。不等式の左辺は \(X\) の増加で狭義単調増加するため、二分探索によりそのような値を求めることができます。
実装によっては 64bit 整数ではオーバーフローすることがあるため注意してください。
writer解(C++)
#include<bits/stdc++.h>
using namespace std;
int solve(long long N,long long A,long long B){
long long ok=0, ng=1;
auto f=[&](long long x){return A*x*(x-1)/2+B*x;};
while(f(ng)<=N)ng*=2;
while(ng-ok>1){
long long mid=(ok+ng)/2;
if(f(mid)<=N)ok=mid;
else ng=mid;
}
return ok;
}
int main(){
int q;
cin >> q;
while(q--){
long long n,a,b;
cin >> n >> a >> b;
cout << solve(n,a,b) << endl;
}
}
posted:
last update:
