题目描述

调戏完了狗,ZCC开始玩起了积木。ZCC的面前有一块n*n的棋盘,他要用这些1*1*1的积木在棋盘上搭出一个宏伟的建筑。积木有三种颜色,ZCC认为一个建筑要被称为宏伟的应该满足能从正面看到的每一个积木都是同一种颜色。现在,ZCC想要知道他能用他拥有的积木搭出多少种宏伟的建筑。当然,为了让建筑足够大,ZCC需要用完他所有的积木。两个建筑被称为不同的当且仅当两个建筑形状不同或者存在一块相同位置不同颜色的积木。

输入

包含四个数n,r,g,b 。表示棋盘大小,红色积木个数,绿色积木个数,蓝色积木个数。

输出

包含一个数,表示方案数,对10^9+7取模。

数据规模与约定

对于10%的数据,n,r≤40 ,g,b=0

对于另外20%的数据,n,r,g,b≤4

对于100% 的数据,n,r,g,b≤30


solution

计数类问题,考虑dp

由于每一列互不影响,我们分开做。

先考虑一列,不考虑颜色

f[i][j][k] 表示前i位,之前最大值为j,放k个木块的方案数

再令g[i][j][k]表示前i列用了k块,主视图面积为j的方案数

g[i][j][k]=g[i-1][j-x][k-y]*f[n][x][y]

然后根据面积填颜色

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
#define mod 1000000007
using namespace std;
int n,a,b,c,S,M,tot;
ll f[45][45][166],g[45][125][125],ans,tmp;
ll h[80005],ny[80005];
ll F(ll a,int num){
ll cnt=1;
while(num){
if(num&1)cnt=cnt*a;
a=a*a%mod;cnt%=mod;num>>=1;
}
return cnt;
}
void getC(){
int o=n*n*n;h[0]=1;
for(int i=1;i<=o;i++)h[i]=h[i-1]*i%mod;
ny[o]=F(h[o],mod-2);
for(int i=o-1;i>=0;i--)ny[i]=ny[i+1]*(i+1)%mod;
}
ll C(int N,int M){
return (h[N]*ny[M]%mod)*ny[N-M]%mod;
} int main()
{
cin>>n>>a>>b>>c;S=a+b+c;M=max(a,max(b,c));
f[0][0][0]=1;
for(int i=1;i<=n;i++){
f[i][0][0]=1;
for(int j=1;j<=M;j++){//M
for(int k=j;k<=S;k++){
for(int x=0;x<=j;x++)
f[i][j][k]=(f[i][j][k]+f[i-1][j][k-x])%mod;
for(int x=0;x<j;x++)
f[i][j][k]=(f[i][j][k]+f[i-1][x][k-j])%mod;
//cout<<"i "<<i<<' '<<"j "<<j<<' '<<"k "<<k<<' '<<f[i][j][k]<<endl;
}
}
}
//
g[0][0][0]=1;
for(int i=1;i<=n;i++){
g[i][0][0]=1;
for(int j=1;j<=S;j++){
for(int k=j;k<=S;k++){
for(int x=0;x<=j;x++)
for(int y=x;y<=k;y++){
g[i][j][k]=g[i][j][k]+g[i-1][j-x][k-y]*f[n][x][y]%mod;
g[i][j][k]%=mod;
}//cout<<"i "<<i<<' '<<"j "<<j<<' '<<"k "<<k<<' '<<g[i][j][k]<<endl;
}
}
}
//for(int i=0;i<=S;i++)cout<<g[n][i][S]<<endl;
getC();
for(int i=1;i<=S;i++){
if(a>=i){
int ns=S-i;
ll tmp=g[n][i][S];
tmp=tmp*C(ns,b)%mod*C(ns-b,c)%mod;
ans=(ans+tmp)%mod;
}
if(b>=i){
int ns=S-i;
ll tmp=g[n][i][S];
tmp=tmp*C(ns,a)%mod*C(ns-a,c)%mod;
ans=(ans+tmp)%mod;
}
if(c>=i){
int ns=S-i;
ll tmp=g[n][i][S];
tmp=tmp*C(ns,a)%mod*C(ns-a,b)%mod;
ans=(ans+tmp)%mod;
}
}
cout<<ans<<endl;
//cout<<ans<<endl;
return 0;
}

ZCC loves cube(cube)的更多相关文章

  1. HDU 4882 ZCC Loves Codefires (贪心)

    ZCC Loves Codefires 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/B Description Though ...

  2. HDU 4873 ZCC Loves Intersection(可能性)

    HDU 4873 ZCC Loves Intersection pid=4873" target="_blank" style="">题目链接 ...

  3. 2014多校第二场1011 || HDU 4882 ZCC Loves Codefires (贪心)

    题目链接 题意 : 给出n个问题,每个问题有两个参数,一个ei(所要耗费的时间),一个ki(能得到的score).每道问题需要耗费:(当前耗费的时间)*ki,问怎样组合问题的处理顺序可以使得耗费达到最 ...

  4. hdu 4882 ZCC Loves Codefires(贪心)

    # include<stdio.h> # include <algorithm> # include <string.h> using namespace std; ...

  5. ZOJ 2477 Magic Cube(魔方)

    ZOJ 2477 Magic Cube(魔方) Time Limit: 2 Seconds      Memory Limit: 65536 KB This is a very popular gam ...

  6. 【Luogu3602】Koishi Loves Segments(贪心)

    [Luogu3602]Koishi Loves Segments(贪心) 题面 洛谷 题解 离散区间之后把所有的线段挂在左端点上,从左往右扫一遍. 对于当前点的限制如果不满足显然会删掉右端点最靠右的那 ...

  7. PLSQL_基础系列02_分组函数GROUP BY / ROLLUP / CUBE(案例)

    2014-11-30 Created By BaoXinjian

  8. hdu 4882 ZCC Loves Codefires(数学题+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...

  9. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...

  10. 【LG 4831】Scarlet loves WenHuaKe(生成函数)

    题目链接 一道好题,第一次用生成函数做题.感谢赛珂狼教我这个做法. 首先我们显然可以把题目中的限制转化成一个二分图的模型:左边有$n$个点,右边有$m$个点,如果在棋盘$(i,j)$这个点上放了炮,那 ...

随机推荐

  1. js jquery 权限单选 bug修改以及正确代码 购物车数量加减

    效果图废话不多直接上代码 用的avalon渲染,其实都是一样的 <div class="shop-arithmetic"> <a href="javas ...

  2. Linux帮助都有哪几种,如何使用?

    帮助文件有2类,内置命令和外部命令. 其中内置命令就是shell内核自带的,因为shell当中自己要进行管理,那么就需要一些命令进行管理,不同的shell肯定有不同的shell命令,我们用type命令 ...

  3. oracle中的预定异常和自定义异常

    预定异常 oracle中的预定异常情况大约有24个,对于这种异常情况的处理,无须再程序中定义,可用oracle自动引发,常见的预定异常如下 异常 说明 ACCESS_INTO_NULL 在未初始化对象 ...

  4. 用 js 写一个获取随机颜色的程序

    function getColor(){ var color="#"; for(var i=0;i<6;i++){ color+=(Math.random()*16 | 0) ...

  5. 十、mysql之索引原理与慢查询优化

    mysql之索引原理与慢查询优化 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还 ...

  6. Eclipse 修改字符集---Eclipse教程第02课

    默认情况下 Eclipse 字符集为 GBK,但现在很多项目采用的是 UTF-8,这是我们就需要设置我们的 Eclipse 开发环境字符集为 UTF-8, 设置步骤如下: 在菜单栏选择 Window ...

  7. 远程 RADIUS 服务器组

    远程 RADIUS 服务器组 远程 RADIUS 服务器组是包含一个或多个 RADIUS 服务器的已命名的组.IAS 用作 RADIUS 请求消息的 RADIUS 代理时,必须指定远程 RADIUS ...

  8. iOS 引用外部静态库(.a文件)时或打包.a时,Category方法无法调用。崩溃

    我的这个是MJRefresh,学习打.a包Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: ...

  9. linux文件上传下载笔记(rz,sz,sftp,scp)命令

    软件(包)安装/卸载 yum -y install 包名(支持*) :自动选择y,全自动yum install 包名(支持*) :手动选择y or nyum remove 包名(不支持*)rpm -i ...

  10. asp.net 身份验证-Form 身份验证

    一. .net身份验证简介 1.身份验证就是检测用户是否登录及所访问的资源是否有权限.当我们在访问一个受保护网络资源时,往往需要输入用户名.密码信息,或通过其他证书.第三方身份验证等方式.验证(Aut ...