1. 程式人生 > 實用技巧 >D - Tokitsukaze and Multiple

D - Tokitsukaze and Multiple

8.2

 

A.

考慮對每個二進位制進行構造,直接給出構造方法:
while(c){ ++n; link(n,1); if(n>2) link(n-1,n); if(c&1) link(1,n); c>>=1; }
容易發現,這樣可以讓每一個二進位制位滿足條件。
 

B.

首先對所有操作的字串建出trie樹。
由於字串總長度不大,所以可以暴力跳對應節點的祖先鏈來更新資訊。
只要記錄子樹總大小,葉子個數,只有一個兒子的節點個數即可簡單轉移。
 

C.

首先考慮序列上怎麼做,如果每個方案的權值是1那麼可以簡單容斥得到合法的方案數。
方案帶權,那麼考慮計算每一個劃分方案的方案數,同樣運用上面的容斥即可。
那麼經過簡單處理可以處理出每個顏色對應的EGF,捲起來即可得到合法的總權值。
考慮怎麼處理環。
首先可以欽定第一個連續段一定是1,並且最後一個連續段一定不是1,並且給最後的答案乘上總個數.
只需要用開頭是1的方案數減去開頭結尾都是1的方案數即可。
發現欽定開頭是1等價於給1的段數減少1,即EGF上對應的下標減少1.
於是可以計算出最後的方案數。發現這樣的話會出一些小問題,就是一個包含k個連續1段的方案會被計算k次,於是在1的生成函式上繼續做一些修改即可。