赛场暴力打表过的, 补std和证明. 题目
题意
两堆石子, 个数为 n , m n, m n,m, 每次从一堆拿 k ( k > 0 ) k(k>0) k(k>0)个, 从另一堆拿 s × k ( s ≥ 0 ) s\times k(s \ge 0) s×k(s≥0)个, 不能操作输. T T T组询问, 问先后手必胜.
1 ≤ n , m ≤ 5 × 1 0 3 , 1 ≤ T ≤ 1 0 4 1 \le n, m \le 5 \times 10^3, 1 \le T \le 10^4 1≤n,m≤5×103,1≤T≤104
题解
打表会发现(确实是打了表才发现的), 一堆石子个数为 i i i, 最多只有一个 j j j, 使得两堆石子 i , j i, j i,j 必败. 下面证明. 假设 ( i , j 1 ) , ( i , j 2 ) (i, j_1), (i, j_2) (i,j1),(i,j2) 必败, 不妨设 i ≤ j 1 < j 2 i \le j_1 < j_2 i≤j1<j2, 状态 ( i , j 2 ) (i, j_2) (i,j2) 可以转移到必败态 ( i , j 1 ) (i, j_1) (i,j1), 即第二堆拿 j 2 − j 1 j_2 - j_1 j2−j1 个, 第一堆不拿( s = 0 s=0 s=0). 这样 ( i , j 2 ) (i, j_2) (i,j2) 是必胜态, 和必败态矛盾.
然后就可以去筛了. ( i , j ) (i, j) (i,j) 必败, 枚举 k , s k, s k,s, ( i + k , j + s k ) , ( i + s k , j + k ) (i+k, j+sk), (i+sk, j+k) (i+k,j+sk),(i+sk,j+k) 必败. 必败态 O ( n ) O(n) O(n) 个, 枚举 k k k O ( n ) O(n) O(n), 枚举 s s s O ( log n ) O(\log n) O(logn), 总复杂度 O ( n 2 log n ) O(n^2 \log n) O(n2logn). 只需要统计 i ≤ j i \le j i≤j 的, 可进一步优化(否则牛客上过不去笑死, 本地跑500ms以内, 本地这样优化200ms以内)