现在的位置: 首页 > 综合 > 正文

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

2017年04月21日 ⁄ 综合 ⁄ 共 1918字 ⁄ 字号 评论关闭

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[n][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;
}

抱歉!评论已关闭.