zoukankan      html  css  js  c++  java
  • dtoj1825. 放棋子(chess)


    Sol

    因为每种颜色的棋子互补影响,我们考虑f[i][j][k]表示前i种颜色,放了j行k列的方案数。

    假设求出g[i][j][k]表示i个棋子占据恰好j行k列的方案数。

    那么有f[i+1][j+x][k+y]=f[i][j][k]*g[a[i+1]][x][y]*C(n-j,x)*C(m-k,y);

    g的话我们用随便填的方案数C(x*y,i)-g[i][j][k]*C(x,i)*C(y,j)

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define ll long long 
    #define mod 1000000009
    using namespace std;
    int n,m,c,a[15],Max;
    ll f[15][35][35],g[956][35][35],C[935][935];
    void init(){
        int N=n*m;
        for(int i=0;i<=N;i++){
            C[i][0]=1;
            for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
        }
        for(int i=1;i<=Max;i++){
            for(int x=1;x<=n;x++){
                for(int y=1;y<=m;y++){
                    if(x*y<i||x>i||y>i)continue;
                    ll tmp=C[x*y][i];
                    for(int j=1;j<=x;j++)
                    for(int k=1;k<=y;k++){
                        if(j==x&&k==y)continue;
                        tmp=(tmp-g[i][j][k]*C[x][j]%mod*C[y][k]%mod)%mod;
                    }
                    g[i][x][y]=tmp;
                    
                }
            }
        }
    }
    int main(){
        
        cin>>n>>m>>c;
        for(int i=1;i<=c;i++)scanf("%d",&a[i]),Max=max(Max,a[i]);
        init();
        f[0][0][0]=1;
        for(int i=0;i<c;i++){
            for(int j=0;j<=n;j++)
            for(int k=0;k<=m;k++){
                if(!f[i][j][k])continue;
                for(int x=1;x+j<=n;x++)
                for(int y=1;y+k<=m;y++){
                    if(x*y>=a[i+1])
                    (f[i+1][x+j][y+k]+=1LL*f[i][j][k]*g[a[i+1]][x][y]%mod*C[n-j][x]%mod*C[m-k][y]%mod)%=mod;
                }
            }
        }
        ll ans=0;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)ans=(ans+f[c][i][j])%mod;
        ans=(ans+mod)%mod;
        cout<<ans<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    一起来学Java注解(Annotation)
    Intellij IDEA在maven项目中添加外部Jar包运行
    Java反射Reflect的使用详解
    Java泛型使用的简单介绍
    聊一聊Java的枚举enum
    Java集合 HashSet的原理及常用方法
    对比分析HashMap、LinkedHashMap、TreeMap
    TreeMap原理实现及常用方法
    关于红黑树(R-B tree)原理,看这篇如何
    百度地图-中国地图
  • 原文地址:https://www.cnblogs.com/liankewei/p/12309634.html
Copyright © 2011-2022 走看看