题目链接 一道找规律的好题。
首先SG函数打表,完全模板:
1 | int mem[1024]; |
观察结果,发现n为偶数时SG函数值是n/2,但n是奇数是规律不明显。
1 | n=1, sg=0 |
但可以观察到sg(n)=0时,n+1为2的次幂。进而猜想sg(n)和n+1的二进制表示有关,继续打表如下:
1 | n=1 sg=0 0000000010 |
上表先按sg(n)排序,再按n排序,并列出n+1的二进制表示。不难发现,n+1末尾的0均可以去掉,不影响sg(n)的结果。注意到,如果n+1末尾有0,则n是奇数;去掉末尾所有0之后n+1必然为奇数而n为偶数,则答案就得到了。代码就可以略去了。