VIJOS1420Valentine’s Seat

題目大意

可以給排列成n+1行m+1列矩陣的椅子上色。其中,第一行所有的椅子都已上好粉紅色,第一列從第2個開始的椅子都已上好天藍色。對於其他的椅子,應保證,它的顏色和它左邊的或上面的椅子顏色相同。求染色的方案數模19900801的值。

分析

通過畫圖或者打表,我們可以發現,最終矩陣肯定被分成2個色塊,粉紅色塊位於矩陣右上方,天藍色塊位於矩陣左下方。每一種染色方案都一一對應於一條從n+1行m+1列的格點地圖的左上角走到到右下角的路徑方案。

如下圖,在一個有5+1行6+1列的地圖中,紫色方框中的是可以染色的椅子,這種染色方案便對應於從方框左上角走到右下角的一條路徑。
一種染色方案
記方框左上角座標爲(1,1),則右下角座標爲(n+1,m+1)
經過格點(x,y) (x<=n,y<=m+1)等價於第x+1行椅子有y-1個藍色。

因此n+1行m+1列椅子染色方案數相當於格點地圖路徑數,即爲:C(n+m,n)
由於19900801是個質數,因此我們直接求逆元算組合數就可以了。時間複雜度O(n)。

代碼

#include<cstdio>
const int mo=19900801;
int n,m;
long long ans;
int ant(int x){
    long long a=x,ans=1;
    int p=mo-2;
    while (p){
        if (p&1)
            ans=(ans*a)%mo;
        p>>=1;
        a=(a*a)%mo;
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    m+=n;
    ans=1;
    for (int i=1;i<=n;i++)
        ans=(ans*(m-i+1))%mo;
    for (int i=2;i<=n;i++)
        ans=(ans*ant(i))%mo;
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章