题目链接 一道找规律的好题。
首先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
为偶数,则答案就得到了。代码就可以略去了。