QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#667365 | #56. Nim Product | xx_mmc | 75 | 1ms | 4008kb | C++23 | 1.5kb | 2024-10-22 22:30:19 | 2024-10-22 22:30:30 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
namespace NIM
{
using uint = unsigned int;
const uint N = 1 << 8;
uint rem[N][N];
bool vis[N][N];
void init() {
memset(vis, 0, sizeof vis);
}
uint nimP(uint x, uint y, int k = 16) {
if (x <= 1 || y <= 1) return x * y;
if (k < 8 && vis[x][y]) return rem[x][y];
uint a = x >> k, b = y >> k, c = x & ((1ull << k) - 1), d = y & ((1ull << k) - 1);
uint ab = nimP(1ull << k >> 1, nimP(a, b, k >> 1), k >> 1);
uint cd = nimP(c, d, k >> 1);
uint res = ((nimP(a ^ c, b ^ d, k >> 1) ^ cd) << k) ^ ab ^ cd;
if (k < 8) {
rem[x][y] = res;
vis[x][y] = 1;
}
return res;
}
};
unsigned int SA, SB, SC;
unsigned int rng()
{
SA ^= SA << 16;
SA ^= SA >> 5;
SA ^= SA << 1;
unsigned int t = SA;
SA = SB;
SB = SC;
SC ^= t ^ SA;
return SC;
}
void solve()
{
int T;
cin >> T >> SA >> SB >> SC;
unsigned int lastans = 0;
NIM::init();
while (T--)
{
unsigned int x = rng() + lastans;
unsigned int y = rng();
// cout << x << " " << y << endl;
lastans = NIM::nimP(x, y);
if (!T)
cout << lastans << endl;
}
}
int32_t main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T = 1;
while (T--)
solve();
return 0;
}
详细
Pretests
Final Tests
Test #1:
score: 25
Accepted
time: 1ms
memory: 3820kb
input:
10 274134852 279286565 744539633
output:
2002382043
result:
ok single line: '2002382043'
Test #2:
score: 25
Accepted
time: 0ms
memory: 4008kb
input:
1000 734766235 309378503 610268282
output:
2106551671
result:
ok single line: '2106551671'
Test #3:
score: 25
Accepted
time: 0ms
memory: 3884kb
input:
30000 784936363 827067061 800454511
output:
554318281
result:
ok single line: '554318281'
Test #4:
score: 0
Time Limit Exceeded
input:
30000000 72129929 485897764 129463885