记录编号 38678 评测结果 AAAAAAAAAA
题目名称 放棋子 最终得分 100
用户昵称 GravatarCzb。 是否通过 通过
代码语言 C++ 运行时间 0.072 s
提交时间 2012-06-01 17:11:31 内存使用 1.02 MiB
显示代码纯文本
/*
UID:cheepok
PID:examtwo
*/
 
#include<stdio.h>
#include<vector>
 
using namespace std;
 
typedef long long Int;
 
struct orz
{Int x,y;};
 
Int n,m,s,t,x,y,f[100][21][300];
 
bool flag[10];
 
vector <orz> v;
 
void swap(Int &a,Int &b)
{a^=b^=a^=b;}
 
Int gcd(Int a,Int b)
{
    while(b^=a^=b^=a%=b);
    return a;
}
 
void dfs(int k)
{
    if(k>m){orz tmp;tmp.x=x;tmp.y=y;v.push_back(tmp);return;}
    y<<=1;dfs(k+1);if(!flag[k-1]){flag[k]=true;x++;y++;dfs(k+1);flag[k]=false;x--;}y>>=1;
}
 
int main()
{
    freopen("examtwo.in","r",stdin);
    freopen("examtwo.out","w",stdout);
    int i,j,k,l;scanf("%lld%lld%lld",&n,&m,&s);
    if(n<m)swap(n,m);dfs(1);t=v.size();
    f[0][0][0]=1;
    for(i=1;i<=n;i++)for(j=0;j<=s;j++)
    for(k=0;k<t;k++)for(l=0;l<t;l++)
    {if((v[k].y&v[l].y)==0&&v[k].x<=j)
    f[i][j][k]+=f[i-1][j-v[k].x][l];}
    x=n*m;y=1;for(i=0;i<s;i++)y*=x-i;
    for(i=2;i<=s;i++)y/=i;x=0;
    for(i=0;i<t;i++)x+=f[n][s][i];
    n=gcd(x,y);printf("%lld/%lld\n",y/n,x/n);
    return 0;
}