作業GFOJ471(sg函式)

2021-07-29 02:43:45 字數 1366 閱讀 4066

problem description

給出一顆滿二叉樹,以及每個樹節點上的石頭數量

a和b輪流操作,每次選擇乙個節點,將其上的任意個石頭推向它的兒子

不能不推,若選擇的節點為葉節點,則被推的石頭消失

a先手,要求輸出在保證a必勝的前提下,a第一步有多少種走法

多組資料

input

第一行乙個t,表示資料組數

每組資料先給出乙個數n,表示二叉樹有n層

接下來有n行,第i行有2^(i-1)個數,表示每個樹節點上的石頭數量

t<=20,n<=15,其餘的數<=10000000

output

對每組資料輸出乙個數,表示有多少種走法

sample input 41

12 1 0 0

3 1

2 2

4 4 4 4

4 13

19 13

13 0 9 8

5 4 6 11 2 16 18 6

sample output

1 0 6 7

部分樣例解釋:

為方便理解已將每組資料隔開

將節點從上到下,從左到右依次編號

第一組僅有一種可能走法,即把一號點的乙個石子下推

第二組a沒有必勝策略,故走法為0

第三組的六種走法分別為

1~2:把一號點的石頭下推,共兩種

3~6:把二或三號點的石頭下推乙個,共四種

problem source

玲瓏杯 round #9

先把樹當奇偶層來看,不妨令最後一層為奇層,則所有奇層的sg函式異或值ans為最終a是否可以獲勝。

易知sg[n]=n。

所以對於奇層的每乙個點的石子數x,都要使其石子數變成k,使得k與除了x之外所有奇層的異或值(即x^ans)相等。

若x=x^ans,則不用處理當前點; 若x

<

x ^an

s ,則應該從上往下推石頭,方案數+1; 若x

>

x ^an

s ,則應該往下推石頭,如果當前層為底層,方案數+1,否則+2(兩棵子樹)。

#include 

#include

#define maxn 20

using

namespace

std;

int tmp,g,t,n,ans,a[maxn][1

for (int i=n;i>0;i-=2)

for (int j=1;j<=(1

<1);j++)

}printf("%d\n",g);

}return

0;}

gfoj 卡夫的菜

題目 有n盤菜,每盤菜都有乙個美味值。但是你只能選m盤菜。並且這些吃菜的順序能影響總美味值。如果i當且僅當在j之前吃,那麼會額外加一些美味值,這樣的組合有k組。求選m盤菜吃能獲得的最大的美味值。input 第一行為n,m,k 第二行n個整數ai 0 ai 10 9 代表每盤菜的美味值 接下來k行每行...

gfoj 區間更新模板

題目 如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 input 第一行包含三個整數n m p,分別表示該數列數字的個數 操作的總個數和模數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m...

gfoj 704 陣列操作

problem 704 陣列操作 time limit 1000 ms memory limit 262144 kb problem description 給出n個陣列,每個陣列有li個整數,將陣列編號為1,2,3,n,然後給出m個數,每個數均為之前陣列的編號,將這些陣列按照給出的編號順序連線起來...