有两把 laser 枪,一把伤害 \(p_0\) 两发间隔时间至少 \(t_0\),另一把 \(p_1, t_1\)。打敌方太空船,血量 \(N\) 防御值 \(s\),如果某个时刻你对太空船打出 \(P\) 的总伤害,对它造成真实伤害就是 \(P - s\)。\(1 \le h \le 5000\),\(2 \le p_1, p_2 \le 5000\)。
直接 DP,\(f(n, x, y)\) 表示还剩 \(n\) 的血量,第一把枪还需要装弹 \(x\) 时间,第二把还需 \(y\),的最少用时。状态数最多约 \(1.25 \times 10 ^ 7\),问题在于如何哈希这个 \((n, x, y)\)。
通过做法的哈希方法质数进制加 long long
自然溢出:
如果哈希表大小开 \(2 ^ {24}\),单链长不超过 \(3\)。
long long hash_tuple(int n, long long x, long long y) {
return n + x * 5007 + y * 5007 * 1000000000007ll;
}
用 \(({\rm xorshift}, +)\) 哈希:
如果哈希表大小开 \(2 ^ {24}\),单链长不超过 \(5\)。
long long xorshift(long long x) {
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
return x;
}
long long hash_tuple(int n, long long x, long long y) {
return xorshift(n) + xorshift(x) + xorshift(y);
}
标签:le,xorshift,long,CF1743E,哈希,FTL,DP
From: https://www.cnblogs.com/Pizza1123/p/16847125.html