链接:https://ac.nowcoder.com/acm/contest/321/G
来源:牛客网
题目描述
题目很长,简写一下。
给你一个数字k;
再给一个公式 ;
求最大的
输入描述:
输入第一行包含一个整数T(T<=200000),表示T组测试数据,
每组数据包含一个整数k(0<=k<=10^18),
输出描述:
输出T行,每行包含一个整数
样例
输入
3
1
3
9
输出
1
1
5
题解
高中学过一个公式:
数据量有点大,二分法算一下就行了。
二分的时候注意r的范围。 x的范围在[l,r)范围内,范围逐渐缩小,区间左闭右开,最后结束循环时 x=l;
代码
#include<algorithm>
#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
typedef long long ll;
ll n;
bool check(ll x){
return x*(x+1)*(2*x+1)/6<=n;
}
int main(){
int t;
cin>>t;
while(t--){
scanf("%lld",&n);
ll l=0,r=1500000;
while(r-l>1){
ll m=(r+l)/2;
if(check(m)){
l=m;
}else {
r=m;
}
}
ll ans=l*(l+1)*(2*l+1)/6;
printf("%lld\n",ans);
}
return 0;
}