管道取珠是小x很喜歡的一款遊戲。在本題中,我們將考慮該遊戲的乙個簡單改版。遊戲畫面如圖1所示:
(圖1)
遊戲初始時,左側上下兩個管道分別有一定數量的小球(有深色球和淺色球兩種型別),而右側輸出管道為空。每一次操作,可以從左側選擇乙個管道,並將該管道中最右側的球推入右邊輸出管道。
例如:我們首先從下管道中移乙個球到輸出管道中,將得到圖2所示的情況。
(圖2)
假設上管道中有n個球, 下管道中有m個球,則整個遊戲過程需要進行n+m次操作,即將所有左側管道中的球移入輸出管道。最終n+m個球在輸出管道中從右到左形成輸出序列。
愛好數學的小x知道,他共有c(n+m,n)種不同的操作方式,而不同的操作方式可能導致相同的輸出序列。舉個例子,對於圖3所示的遊戲情形:
(圖3)
我們用a表示淺色球,b表示深色球。並設移動上管道右側球的操作為u,移動下管道右側球的操作為d,則共有c(2+1,1)=3種不同的操作方式,分別為uud,udu,duu;最終在輸出管道中形成的輸出序列(從右到左)分別為bab,bba,bba。可以發現後兩種操作方式將得到同樣的輸出序列。
假設最終可能產生的不同種類的輸出序列共有k種,其中:第i種輸出序列的產生方式(即不同的操作方式數目)有ai個。聰明的小x早已知道,
σai=c(n+m,n)
因此,小x希望計算得到:
σ(ai)^2
你能幫助他計算這個值麼?由於這個值可能很大,因此只需要輸出該值對1024523的取模即可(即除以1024523的餘數)。
說明:文中c(n+m,n)表示組合數。組合數c(a,b)等價於在a個不同的物品中選取b個的選取方案數。
輸入格式:
輸入檔案中的第一行為兩個整數n,m,分別表示上下兩個管道中球的數目。
第二行中為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中:a表示淺色球,b表示深色球。
第三行中為乙個ab字串,長度為m,表示下管道中的情形。
輸出格式:
輸出檔案中僅一行為乙個整數,即為 除以1024523的餘數。
輸入樣例#1:
2 1輸出樣例#1:abb
5【樣例說明】
樣例即為文中(圖3)。共有兩種不同的輸出序列形式,序列bab有1種產生方式,而序列bba有2種產生方式,因此答案為5。
【資料規模和約定】
對於30%的資料,滿足:m,n<=12;
對於100%的資料,滿足:m,n<=500。
一種新的dp姿勢qwq,統計∑a[i] ^ 2 就相當於統計有多少 有序方案相同,或者簡單的說就是取兩次,第二次的序列和第一次的序列一樣的方案數,直接暴力四維dp即可,因為最後一維受限,實際上只有三維,轉移o(1),可以滾動陣列。。。
#include#define ll long longusing namespace std;
const int ha=1024523,maxn=505;
inline void add(int &x,int y)
int f[2][maxn][maxn],n,m,now,nxt;
char a[maxn],b[maxn];
inline void dp()
if(j)
}}}
int main()
NOI2009 管道取珠
noi2009 管道取珠 給出乙個長度為n的01序列 和乙個長度為m的01序列 給出 n m 個格仔,按順序將a和b填入,也就是事先選好n個位置,按順序地填入a,然後其它的按順序填入b,設填後的格仔有 c 次重複,問所有的格仔填法 c 2 的和,n,m leq 500 平方可以轉換為兩個人填,方案相...
NOI2009 管道取珠
sum a i a i 可以理解為兩個獨立但同時進行的遊戲得到同乙個輸出序列的方案數。設f l,i,j 為每個遊戲都已經推出了l個珠子時,第乙個遊戲裡上邊兒的管道已經推出了i個,第二個遊戲中上邊兒管道推出了j個的方案數。考慮到若要推出序列相同,那麼對於每個階段l,兩個遊戲的推出序列應始終相等。這樣,...
NOI2009 管道取珠
對於處理方案數量平方的優化 可以看成兩個人玩同乙個遊戲,他們輸出序列一樣的種類數。然後設f i1 j1 i1 j2 為當前狀態方案數量的平方和。i1,i2表示第乙個人上管道,下管道分別取出了i1,i2個,i2,j2表示第二個人 i1 j1 i2 j2,所以可以把最後一維去掉。然後加乙個滾動陣列可以進...