UVA #11806 Cheerleaders

注意考虑题目的反条件,题目要求上中下四条边都有,那么枚举上中下四条边没有的情况,无需考虑角落的细节条件。

另外,每个条件可以直接求出剩下的矩形的长宽,直接c(c*r,k)求解即可。

#include<cstdio>
int e[510][510];
const int mod=1000007;
void make(){
    for(int i=0;i<510;i++)
        e[i][0]=1;
    for(int i=1;i<510;i++)
        for(int j=1;j<510;j++)
            e[i][j]=(e[i-1][j-1]+e[i-1][j])%mod;
}
int main(){
    make();
    int i,j,c,r,n,m,k,cs,csi=1,as;
    for(scanf("%d",&cs);cs--;){
        scanf("%d%d%d",&n,&m,&k);
        as=0;
        for(i=0;i<(1<<4);i++){
            j=0;c=n;r=m;
            if(i&1){c--;j++;}
            if(i&2){c--;j++;}
            if(i&4){r--;j++;}
            if(i&8){r--;j++;}
            as=(as+e[c*r][k]*(j%2?-1:1))%mod;
        }
        printf("Case %d: %d\n",csi++,(as+mod)%mod);
    }
    return 0;
}


你可能感兴趣的:(容斥原理)