ACM模版
描述
题解
这个题,简单的来,就是暴力打表找规律,注意一点, sqrt() 可能存在精度问题,最好自己写一个二分的,因为这个, WA 了四回……
官方题解也给大家分享一下,写得挺详细的:
代码
#include <cstdio>using namespace std;typedef long long ll;const ll INF = 1e10; // ll 开方后约为 1e9ll x, k;ll sqrt(ll x){ll l = -1, r = INF, m;while (r - l > 1){m = (l + r) >> 1;if (m * m > x){r = m;}else if (m * m < x){l = m;}else{return m;}}return l;}int main(){int T;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 t = sqrt(x - 1);if (y * y == x || t * t == x - 1){printf("%lld\n", y * 2 - 2);}else{printf("%lld\n", y * 2 - 1);}}}}return 0;}