2013-team5/andrew/30/F
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
{{{
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
typedef long long LL;
int main() {
freopen("nim.in", "r", stdin);
freopen("nim.out", "w", stdout);
LL n, p[60]; p[0] = 1;
for (int i = 1; i < 60; ++ i) p[i] = p[i - 1] * 2ll;
scanf("%I64d", &n);
LL sum = 0, K = 0;
while (1) {
K ++;
sum += p[K] + (p[K] + p[K + 1]) * (p[K + 1] - p[K] - 1);
if (sum >= n) break;
}
sum -= p[K] + (p[K] + p[K + 1]) * (p[K + 1] - p[K] - 1);
n -= sum;
if (n <= p[K]) {
if (n == p[K]) puts("LOSE");
else puts("WIN");
} else {
n -= p[K];
LL left = 1, right = p[K] - 1;
while (left < right) {
LL mid = (left + right - 1) >> 1ll;
LL tmp = 2ll * (p[K] * mid + (mid + 1) * mid / 2);
if (tmp >= n) right = mid;
else left = mid + 1;
}
LL tmp = 2ll * (p[K] * (left - 1) + (left - 1) * left / 2);
if (n == tmp + p[K] + left || n == tmp + p[K] * 2 + left * 2) puts("LOSE");
else puts("WIN");
}
fclose(stdin); fclose(stdout);
return 0;
}
}}}
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
typedef long long LL;
int main() {
freopen("nim.in", "r", stdin);
freopen("nim.out", "w", stdout);
LL n, p[60]; p[0] = 1;
for (int i = 1; i < 60; ++ i) p[i] = p[i - 1] * 2ll;
scanf("%I64d", &n);
LL sum = 0, K = 0;
while (1) {
K ++;
sum += p[K] + (p[K] + p[K + 1]) * (p[K + 1] - p[K] - 1);
if (sum >= n) break;
}
sum -= p[K] + (p[K] + p[K + 1]) * (p[K + 1] - p[K] - 1);
n -= sum;
if (n <= p[K]) {
if (n == p[K]) puts("LOSE");
else puts("WIN");
} else {
n -= p[K];
LL left = 1, right = p[K] - 1;
while (left < right) {
LL mid = (left + right - 1) >> 1ll;
LL tmp = 2ll * (p[K] * mid + (mid + 1) * mid / 2);
if (tmp >= n) right = mid;
else left = mid + 1;
}
LL tmp = 2ll * (p[K] * (left - 1) + (left - 1) * left / 2);
if (n == tmp + p[K] + left || n == tmp + p[K] * 2 + left * 2) puts("LOSE");
else puts("WIN");
}
fclose(stdin); fclose(stdout);
return 0;
}