您的位置:首页 > 其它

【组合计数】【bzoj 3294】: [Cqoi2011]放棋子

2014-12-30 17:33 477 查看
http://www.lydsy.com/JudgeOnline/problem.php?id=3294

啊哈哈哈做了近1.5h

好不容易把yxj的方法看懂了(其实是蒟蒻一直把题看错了),就打算A掉这道题

就把g数组的k从1-250都枚举了一遍

理论上TLE,bzoj上却RE!!!!????

没找到为什么,突然发现k是没有参与递推的,又改了很久很久

最后因为少取了个模!!!!!找了半个多小时

貌似多比yxj乘了几个组合数

啊还是不要秀智商了,上代码——

//#define _TEST _TEST
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
/************************************************
Code By willinglive    Blog:http://willinglive.cf
************************************************/
#define rep(i,l,r) for(int i=(l),___t=(r);i<=___t;i++)
#define per(i,r,l) for(int i=(r),___t=(l);i>=___t;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define LL long long
#define INE(i,u,e) for(int i=head[u];~i;i=e[i].next)
inline const int read()
{int r=0,k=1;char c=getchar();for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';return k*r;}
/////////////////////////////////////////////////
const int mod=1000000009;
int n,m,c;
int a[15];
LL C[910][910];
LL f[20][35][35];
LL g[11][35][35];
/////////////////////////////////////////////////

/////////////////////////////////////////////////
void input()
{
cin>>n>>m>>c;
rep(i,1,c) cin>>a[i];
}
void solve()
{
// C[]
rep(i,0,900) C[i][0]=1;
rep(i,1,900) rep(j,1,i)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
// g[]
rep(k,1,c)
rep(i,1,30) rep(j,1,30) if(i*j>=a[k])
{
g[k][i][j]=C[i*j][a[k]];
rep(x,0,i) rep(y,0,j) if(x||y)
{
g[k][i][j]-=((g[k][i-x][j-y]*C[i][x])%mod)*C[j][y]%mod;
if(g[k][i][j]<0) g[k][i][j]+=mod;
}
g[k][i][j]%=mod;
if(g[k][i][j]<0) g[k][i][j]+=mod;
}
// f[]
rep(i,1,n) rep(j,1,m) f[1][i][j]=g[1][i][j];
rep(k,2,c)
rep(i,1,n) rep(j,1,m)
{
rep(x,0,i) rep(y,0,j)
{
f[k][i][j]+=f[k-1][x][y]*g[k][i-x][j-y]%mod*C[i][i-x]%mod*C[j][j-y]%mod%mod;
f[k][i][j]%=mod;
}
}
LL ans=0;
rep(i,0,n) rep(j,0,m) ans+=f[c][i][j]*C
[i]%mod*C[m][j]%mod;
cout<<ans%mod<<endl;
}
/////////////////////////////////////////////////
int main()
{
#ifndef _TEST
freopen("std.in","r",stdin); freopen("std.out","w",stdout);
#endif
input(),solve();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: