QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#129384 | #6744. Square | SolitaryDream# | AC ✓ | 31ms | 3704kb | C++20 | 1.6kb | 2023-07-22 17:48:03 | 2023-07-22 17:48:07 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int Sqr(int x) {
return x * x;
}
inline int GetDelta(int x) {
if (x == 0) return 1;
if (x == 1) return 2;
if (x == 2) return 3;
int ans = sqrtl((long double)2 * x) + 1.5;
// while (Sqr(2 * ans - 3) > 8 * x) --ans;
ans -= 3;
while (Sqr(2 * ans - 1) <= 8 * x) ++ans;
return ans;
}
inline int Jump(int x, int k) {
int delta = GetDelta(x);
return x + (delta + delta + k - 1) * k / 2;
}
inline void Solve(int x, int y) {
if (x >= y) { printf("%lld\n", x - y); return; }
int delta = GetDelta(x);
int k = -1;
for (int l = 1, r = 1e10; l <= r; ) {
int mid = (l + r) >> 1;
if (x + (__int128)(delta + delta + mid - 1) * mid / 2 >= y) k = mid, r = mid - 1;
else l = mid + 1;
}
int nx = Jump(x, k);
if (GetDelta(nx) == GetDelta(y)) {
printf("%lld\n", k + nx - y);
} else {
printf("%lld\n", GetDelta(x) - 1 - (y - Jump(x, k - 1)) + k);
}
}
signed main() {
// for (int i = 0; i <= 10000000; ++i) {
// int j = Jump(i, 1), k = Jump(j, 1);
// assert(j - i + 1 == k - j);
// }
// puts("ok");
// int ans = 999999998585786438;
// cout << Jump(ans, 1) << endl;
// cout << GetDelta(5) << endl;
// for (int i = 0; i <= 20; ++i) {
// cout << GetDelta(i) << ' ' << sqrt(2 * i) + 1.5 << endl;
// }
int Case;
scanf("%lld", &Case);
while (Case--) {
int x, y;
scanf("%lld%lld", &x, &y);
Solve(x, y);
}
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3656kb
input:
2 5 1 1 5
output:
4 3
result:
ok 2 number(s): "4 3"
Test #2:
score: 0
Accepted
time: 31ms
memory: 3704kb
input:
100000 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 1 11 1 12 1 13 1 14 1 15 1 16 1 17 1 18 1 19 1 20 1 21 1 22 1 23 1 24 1 25 1 26 1 27 1 28 1 29 1 30 1 31 1 32 1 33 1 34 1 35 1 36 1 37 1 38 1 39 1 40 1 41 1 42 1 43 1 44 1 45 1 46 1 47 1 48 1 49 1 50 1 51 1 52 1 53 1 54 1 55 1 56 1 57 1 58 1 59 1 60 1 ...
output:
0 2 1 4 3 2 6 5 4 3 8 7 6 5 4 10 9 8 7 6 5 12 11 10 9 8 7 6 14 13 12 11 10 9 8 7 16 15 14 13 12 11 10 9 8 18 17 16 15 14 13 12 11 10 9 20 19 18 17 16 15 14 13 12 11 10 22 21 20 19 18 17 16 15 14 13 12 11 24 23 22 21 20 19 18 17 16 15 14 13 12 26 25 24 23 22 21 20 19 18 1 0 2 2 1 3 4 3 2 4 6 5 4 3 5 ...
result:
ok 100000 numbers