题解洛谷P1497(c++解法)木牛流马

题目传送门

思路

看摆哪一些行:从 n 行里选 k行,自然就是 C(k,n) 了

再看列该怎么摆:从 nn 列里选 kk 列,并与行对应(其实就是排列),共有 A(k,n)种方法。

∴ 摆放的位置共有 C(k,n)*A(k,n)个

考虑完位置,该看颜色了

每次从 k个木牛流马中选出 ii 个涂一种颜色,都有 C(i,k) 种涂法。但是要注意涂完颜色都要从 k 里减去 i,因为

这i个已经涂过颜色,不能再涂了

#include<bits/stdc++.h>//懒人专用万能头
using namespace std;
#define ll long long
ll i,ans=1,k,h,num;//记得开long long,int会炸;ans为总方案数
ll c(char lx,int m,int m)//计算排列组合,lx=='a'为排列,lx=='c'为组合
{
    ll s=1;
    for(int x=n;x>n-m;x--)s*=x;//根据排列公式计算A(a,b)
    if(lx=='c')for(int x=m;x>0;x--)s/=x;//如果是组合就要除以m!
    return s;
}
int main()
{
    cin>>num>>k>>h;
    ans*=c('c',k,num);//选择摆哪一些行: C(k,num)
    ans*=c('a',k,num);//列的摆法: A(k,num)
    for(int x=1;x<=h;x++){
        cin>>i;//i为该颜色木牛流马的个数
        ans*=c('c',i,k);//从k个木牛流马中选择i个涂颜色
        k-=i;//一定要记得减去i,这i个不能再涂了!! 
    }
    cout<<ans;//输出答案 
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值