Vijos 1166题:木牛流马

描述

孔明造出了木牛流马
木牛者,方腹曲头,一脚四足,头入领中,舌著于腹。载多而行少,宜可大用,不可小使;特行者数十里,群行者二十里也。曲者为牛头,双者为牛脚,横者为牛领,转者为牛足,覆者为牛背,方者为牛腹,垂者为牛舌,曲者为牛肋,刻者为牛齿,立者为牛角,细者为牛鞅,摄者为牛秋轴。牛仰双辕,人行六尺,牛行四步。载一岁粮,日行二十里,而人不大劳。流马尺寸之数,肋长三尺五寸,广三寸,厚二寸二分,左右同。前轴孔分墨去头四寸,径中二寸。前脚孔分墨二寸,去前轴孔四寸五分,广一寸。前杠孔去前脚孔分墨二寸七分,孔长二寸,广一寸。后轴孔去前杠分墨一尺五分,大小与前同。后脚孔分墨去后轴孔三寸五分,大小与前同。后杠孔去后脚孔分墨二寸七分,后载克去后杠孔分墨四寸五分。前杠长一尺八寸,广二寸,厚一寸五分。后杠与等版方囊二枚,厚八分,长二尺七寸,高一尺六寸五分,广一尺六寸,每枚受米二斛三斗。从上杠孔去肋下七寸,前后同。上杠孔去下杠孔分墨一尺三寸,孔长一寸五分,广七分,八孔同。前后四脚,广二寸,厚一寸五分。形制如象,靬长四寸,径面四寸三分。孔径中三脚杠,长二尺一寸,广一寸五分,厚一寸四分,同杠耳。(《三国志·亮集载作木牛流马法》)
可是在现实中它有个缺陷,就是两个不能在同一行或同一列!
孔明兴高采烈的叫庞统来参观,孔明存心想难一难庞统,他把k个木牛流马放在一个大的n*n的格子地板上,并且给他们都染上色,想让庞统帮着算算有多少种不同的合理布局情况?

格式

输入格式

第一行:n,k,h(h为有多少种颜色) n<=20
接下来h行为每种颜色多少个

输出格式

合理布局情况总数

样例1

样例输入1

4 4 1
4

样例输出1

24

提示

不需要高精度,并且孔明规定在格子地板上不能翻转,也就是说如果两种布局在翻转后是一样的仍算两种。


#include 

using namespace std;

int fac(int n);

int main()
{
	int n, k, h;
	long long ans;
	int a[21];
	cin >> n >> k >> h;//n<=20
	for (int i = 0;i < h;i++)
		cin >> a[i];
	if (k <= n)
	{
		ans = 1;
		for (int i = 0, j = n;i < k;i++, j--)
		{
			ans *= j;
		}
		ans = ans*ans;
		for (int i = 0;i < h;i++)
			ans /= fac(a[i]);
		cout << ans << endl;
	}
	else
		cout << "0" << endl;
	return 0;
}

int fac(int n)
{
	int f;
	if (n == 1)
		f = 1;
	else
		f = n*fac(n - 1);
	return f;
}

你可能感兴趣的:(Online,Judge)