题目描述

调戏完了狗,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. GNU汇编 存储器访问指令

    .text .global  _start _start: mov r0,#0xff str r0,[r1] ldr r2,[r1]

  2. IntelliJ IDEA 12 创建Web项目 教程 超详细版【转】

    IntelliJ IDEA 12 新版本发布 第一时间去官网看了下  黑色的主题 很给力 大体使用了下  对于一开始就是用eclipse的童鞋们 估计很难从eclipse中走出来 当然 我也很艰难的走 ...

  3. iPhone 横屏时默认会放大文字的问题

    有人说用 html { text-size-adjust: 100%; }我发现这个并不能解决问题.下面代码可以完美解决. 添加标签:<meta name="viewport" ...

  4. <Docker学习>5. docker数据管理

    当我们创建了一个tomcat容器,如何简单部署一个web应用?如何将war包放入到容器中?也就是说怎么样把文件从宿主机中 "放入" 到容器中? docker cp命令可以将宿主机本 ...

  5. 硬件中断--DEBUG系列

    问题描述: 在线调试时,全速运行,程序进入硬件中断,查看堆栈窗口,发现是从A函数进去的.但是A函数应该没有问题的: 再次重复,发现是从B函数进去的,但是B函数之前运行起来也没有问题的,而且没有传入参数 ...

  6. Hive LanguageManual DDL

    hive语法规则LanguageManual DDL SQL DML 和 DDL 数据操作语言 (DML) 和 数据定义语言 (DDL) 一.数据库 增删改都在文档里说得也很明白,不重复造车轮 二.表 ...

  7. Android面试收集录10 LruCache原理解析

    一.Android中的缓存策略 一般来说,缓存策略主要包含缓存的添加.获取和删除这三类操作.如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大 ...

  8. Android 自定义光标样式

    今天自定义光标,自己切图,不过怎么切都是很宽.不是一个很细的条.我用ps花了一个像素的直线,放上去还是不行.后来在网上找到方法,那就是用shape.不得不说,shape真的是太吊了. 给EditTex ...

  9. jmeter 运行脚本报错 java.net.BindException: Address already in use

    在win下跑jmeter时,在聚合报告中出现错误.打开日志文件(前提是将日志写入了指定文件) 发现报错的原因为:java.net.BindException: Address already in u ...

  10. Python 3基础教程3-数学运算

    本文来介绍下Python中的常见数学运算,其实和其他语言一样,加减乘除语法差不多,这里注意下Python中指数的表示方法. # 这里介绍 常见的数学运算 # 加法print(5 + 8) # 减法pr ...