记录编号 496240 评测结果 AAAAAAAAAA
题目名称 放棋子 最终得分 100
用户昵称 Gravatar-1 是否通过 通过
代码语言 C++ 运行时间 0.013 s
提交时间 2018-05-02 00:24:28 内存使用 0.65 MiB
显示代码纯文本
#define _CRT_SECURE_NO_DEPRECATE
/************************
*创建时间:2018 05 02 
*文件类型:源代码文件
*题目来源:COGS
*当前状态:已通过
*备忘录:状态压缩 动态规划
*作者:HtBest
 ************************/
#include <stdio.h>
#include <iostream>
#include <string>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m,p,way[1100],_way;
long long f[2][1<<10][21];
/* Variable explain:

*/
bool check(int x)
{
	bool flag=0;
	while(x)
	{
		if(x&1)
		{
			if(flag)return false;
			flag=1;
		}
		else flag=0;
		x>>=1;
	}
	return true;
}
bool check(int x,int y){return !(x&y);}
void read()
{
	freopen("examtwo.in","r",stdin);
	freopen("examtwo.out","w",stdout);
	scanf("%d%d%d",&n,&m,&p);
	if(n>m)swap(n,m);
	for(int i=0;i<(1<<n);++i)	if(check(i))way[++_way]=i;
	// for(int i=1;i<=_way;++i)	printf("%d\n",way[i]);
	return;
}
int num(int x)
{
	int ans=0;
	while(x)
	{
		ans+=x&1;
		x>>=1;
	}
	return ans;
}
long long dp()
{
	int t=1;
	long long ans=0;
	for(int i=1;i<=_way;++i)
		f[0][way[i]][num(way[i])]=1;
	for(int T=1;T<m;++T)
	{
		for(int i=1;i<=_way;++i)
		{
			for(int j=1;j<=_way;++j)
			{
				if(!check(way[i],way[j]))continue;
				for(int k=num(way[i]);k<=p;++k)
					f[t][way[i]][k]+=f[t^1][way[j]][k-num(way[i])];
			}
		}
		t^=1;
		memset(f[t],0,sizeof(f[t]));
	}
	t^=1;
	for(int i=1;i<=_way;++i)
		ans+=f[t][way[i]][p];
	return ans;
}
long long gcd(int a,int b){return !b?a:gcd(b,a%b);}
long long C(int a,int b)
{
	long long c=1;
	for(int i=1;i<=b;++i)
		c=c*(a-i+1)/i;
	return c;
}
int main()
{
	read();
	long long a=dp(),b=C(n*m,p),c=gcd(a,b);
	printf("%lld/%lld",b/c,a/c);
	return 0;
}