题目:这里写链接内容
思路:
先确定x为完全平方数的话,要先减去k,然后再进行开方平方,这样才能获得最小操作数
因为k只能为1,2,所以打表找规律
k=1,完全平方数2⌊√x⌋−1,否则2⌊√x⌋
k=2,特判下小于等于5的
x或x-1是完全平方数2⌊√x⌋−2,否则2⌊√x⌋−1
代码(参考here):
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll sqrt(ll x)
{
ll l = -1,r = 1e10,mid;
while(r-l > 1)
{
mid = (l+r)>>1;
if(mid*mid > x)
r = mid;
else if(mid*mid < x)
l = mid;
else
return mid;
}
return l;
}
int main()
{
int T;
ll x,k;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&x,&k);
if(x == 0)
{
printf("0\n");
continue;
}
ll y = sqrt(x);
if(k == 1)
{
if(x == 1)
{
printf("1\n");
continue;
}
if(y*y == x)
printf("%lld\n",y*2-1);
else
printf("%lld\n",y*2);
}
else
{
if(x == 1 || x == 3)
printf("-1\n");
else if(x == 2)
printf("1\n");
else if(x == 5)
printf("3\n");
else
{
ll z = sqrt(x-1);
if(y*y == x || z*z == x-1)
printf("%lld\n",y*2-2);
else
printf("%lld\n",y*2-1);
}
}
}
return 0;
}