记录编号 489942 评测结果 AAAAAAAAAA
题目名称 放棋子 最终得分 100
用户昵称 GravatarWHZ0325 是否通过 通过
代码语言 C++ 运行时间 0.059 s
提交时间 2018-03-06 15:00:21 内存使用 0.57 MiB
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <vector>
typedef long long int ll;
int gcd(ll a,ll b) {
	return b==0?a:gcd(b,a%b);
}
inline ll c(int n,int m) {
	ll c=1;
	for(int k=1;k<=m;++k) {
		c=c*(n-k+1)/k;
	}
	return c;
}
int n,m,pn;
ll f[2][1<<10][21];
std::vector<int> state;
std::vector<int> cnt;
int main() {
	freopen("examtwo.in","r",stdin);
	freopen("examtwo.out","w",stdout);
	scanf("%d%d%d",&n,&m,&pn);
	if(n<m) std::swap(n,m);
	int temp;
	for(int i=0;i<(1<<m);++i) {
		if(((i<<1)&i)==0) {
			temp=0;
			for(int j=0;j<m;++j) {
				if((i>>j)&1) ++temp;
			}
			state.push_back(i);
			cnt.push_back(temp);
		}
	}
	for(unsigned int i=0;i<state.size();++i) {
		if(pn-cnt[i]>=0) f[0][i][pn-cnt[i]]=1;
	}
	for(int i=2;i<=n;++i) {
		for(unsigned int j=0;j<state.size();++j) {
			for(int k=0;k+cnt[j]<=pn;++k) {
				f[(i+1)%2][j][k]=0;
				for(unsigned int l=0;l<state.size();++l) {
					if((state[j]|state[l])==(state[j]^state[l])) {
						f[(i+1)%2][j][k]+=f[i%2][l][k+cnt[j]];
					}
				}
			}
		}
	}
	ll x=c(n*m,pn),y=0;
	for(unsigned int i=0;i<state.size();++i) {
		y+=f[(n+1)%2][i][0];
	}
	int g=gcd(x,y);x/=g;y/=g;
	printf("%lld/%lld\n",x,y);
	fclose(stdin);
	fclose(stdout);
	return 0;
}