19 12 31QWQ和棋局挑戰題解

2021-10-01 20:43:03 字數 1114 閱讀 2179

nefuoj1606

qwq和棋局挑戰題解

在乙個n∗n

n* n

n∗n大小的棋盤上放置k

kk個棋子,要求放置後的棋盤上每一行和每一列最多有乙個棋子,求方案數,其中0

<

n<9,

0<

k<=n

00<

n<9,

0<

k<=n

。1.和八皇后問題不同,去掉了每條對角線上最多有乙個棋子的限制.

2.(法i)考慮dfs.

dfs(y,cnt)表示當前考慮第y行,放置了cnt枚棋子

對於每一種狀態,可以選擇在第y行放置棋子,也可以選擇不放.

void

dfs(

int y,

int cnt)

if(y==n+1)

return

;for

(int i=

1;i<=n;i++)}

dfs(y+

1,cnt)

;}

3.(法ii)排列組合

先考慮k嚴格小於n的情況.若逐行考慮,棋盤中一定含有n−k

n-kn−

k個空行.

先把k枚棋子放進k行n列的棋盤,n1=

n∗(n

−1)∗

...(

n−k+

1)=a

nk

n1=n*(n-1)*...(n-k+1)=a_n^k

n1=n∗(

n−1)

∗...

(n−k

+1)=

ank​

,(此處亦可以用深搜實現)

再把k行棋盤放進n行棋盤中,n2=

cn

kn2=c_n^k

n2=cnk

​.由分步乘法計數原理,ans

=n1∗

n2

ans=n1*n2

ans=n1

∗n2.

特別地,當n=k

n=kn=

k時,ans

=n

!ans=n!

ans=n!

,亦符合上式.

神奇線段樹QWQ

線段樹基於分治的思想會分治的思想,用於區間求值問題。比如說 求區間的最大值,最小值等等 給出乙個長隊為8的區間對他進行操作。先將他分成若干區間 如圖藍色為區間標號,紅色為區間 直到分成單個點並把所需要的資訊存到單點上。建樹 void build tree int k,int l,int r 如果l ...

splay 學習總結 QwQ

省選之前就大概搞了下 splay 然後因為時間不太夠就沒寫總結了,然後太久沒用之後現在一回想感覺跟沒學過一樣了嚶嚶嚶 所以寫個簡陋的總結,肥腸簡陋,只適合 gql 複習用,不建議學習用 然後先推薦兩篇部落格,orz yyb 的部落格 qwq 我之前就是看這個學的 qwq orz xzy 學長的部落格...

Trie樹的二三事QWQ

寫在前面trie,又稱字典樹,是一種用於實現字串快速檢索的多叉樹結構。trie的每個結點都擁有若干字元指標,若在插入或檢索字串時掃瞄到乙個字元c,就沿著當前節點的c這個字元指標,走向該指標指向的結點。我的沒有指標的版本理解 樹上的每個結點都記錄了兩個資訊,一是這個結點所代表的字元,二是這個字元是否是...