VIJOS1420Valentine’s Seat

14 篇文章 0 订阅

题目大意

可以给排列成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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值