題目大意
可以給排列成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;
}