题解:P14304 【MX-J27-T1】分块
计算得到对于所有整数
展开平方式
最后注意不要用标准的 sqrt 函数,会爆 long long ,要用二分查找平方根。时间复杂度
AC CODE
#include<iostream>
using namespace std;
long long q,n;
long long sqrts(long long n)
{
long long l = 1,r = 1e9;
while(l <= r)
{
long long mid = (l + r) >> 1;
if(mid * mid > n) r = mid - 1;
else l = mid + 1;
}
return r;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> q;
while(q--)
{
cin >> n;
long long sqrtnum = sqrts(n);
if(sqrtnum * sqrtnum + sqrtnum > n) cout << 3ll * (sqrtnum - 1) + 1;
else if(sqrtnum * sqrtnum + sqrtnum <= n && sqrtnum * sqrtnum + sqrtnum * 2 > n) cout << 3ll * (sqrtnum - 1) + 2;
else cout << 3ll * sqrtnum;
cout << '\n';
}
}