比赛 20111021 评测结果 ATAAWWAWWA
题目名称 掷骰子 最终得分 50
用户昵称 donny 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-10-21 20:59:16
显示代码纯文本
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int i,j,k,l,p,q,r;
int n,s,e;
int a[30];
string ss[30];
long long total;
bool b;
bool d[30];
int c[30][30];

long long cc(int x,int y)
{
	long double w;
	int i;
	w=1;
	for (i=x;i>y;i--)
		w=w*i;
	for (i=x-y;i>1;i--)
		w/=i;
	return long(w);
}

long long suan()
{
	long double w;
	int i,j;
	j=n;
	w=1;
	for (i=1;i<=s;i++)
	{
		if (a[i]>0)
		{
			w*=cc(j,a[i]);
			j-=a[i];
		}
	}
	return long(w);
}

void full(int x)
{
	if (x<0)
	{
		return;
	}
	else
	{
		if (x==0)
		{
			if (b)
				total+=suan();
			else
				total-=suan();
		}
		else
		{
		int i;
		for (i=1;i<=s;i++)
		{
			a[i]++;
			full(x-1);
			a[i]--;
		}
		}
	}
}

int Max(int x,int y)
{
	if (x>y)
		return x;
	else
		return y;
}

void go(int x,int y,int z)
{
	int i,j,k;
	if (x==y)
	{
		for (i=1;i<=s;i++)
			a[i]=0;
		for (j=1;j<=e;j++)
			if (d[j])
			{
				for (k=1;k<=s;k++)
				{
					if (c[j][k]!=0)
					{
						if (a[k]==0)
							a[k]=c[j][k];
						else
							a[k]=Max(a[k],c[j][k]);
					}
				}
			}
		j=0;
		for (i=1;i<=s;i++)
			j+=a[i];
		full(n-j);
	}
	else
	{
		for (i=z;i<=e-(x-y)+1;i++)
		{
			d[i]=1;
			go(x,y+1,i+1);
			d[i]=0;
		}
	}
}

int main()
{
	ifstream fin("cowyotz.in");
	ofstream fout("cowyotz.out");
	
	fin>>n>>s>>e;
	
	for (i=1;i<=e;i++)
		fin>>ss[i];
	
	total=0;
	
	for (i=1;i<=e;i++)
	{
		for (j=1;j<=s;j++)
			a[j]=0;
		j=0;
		p=0;
		while (j<(ss[i].length()))
		{
			a[int(ss[i][j+2])-int('0')]=int(ss[i][j])-int('0');
			p=p+a[int(ss[i][j+2])-int('0')];
			c[i][int(ss[i][j+2])-int('0')]=a[int(ss[i][j+2])-int('0')];
			j+=4;
		}
		b=1;
		full(n-p);
	}
	
	for (i=2;i<=n;i++)
	{
		if (b)
			b=0;
		else
			b=1;
		for (j=1;j<=e;j++)
			d[j]=0;
		go(i,0,1);
	}
	
	fout<<total;
	
	fin.close();
	fout.close();
	
	return 0;
}