思路
看摆哪一些行:从 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;
}