【题意】给定一个数top及最底层元素个数n,构成一个以给top为塔尖,层数为n的如杨辉三角的金字塔,求有多少种

【分析】最终种数其实只与最底层的n个数的组合数有关,上层的每个都数是由最底层数相加得来

以层数4为例

设最底层 x1,x2,x3,x4

则第二层x1+x2,x2+x3,x3+x4

第三层x1+2*x2+x3, x2+2*x3+x4

最高层 x1+3*x2+3*x3+x4

可以看出  1 3 3 1   C(3,0) C(3,1) C(3,2) C(3,3)

所以问题可以看做是一个以 C(n-1,0) C(n-1,1).....C(n-1,n)为单个物品容量,容量和为2^(n-1),top为背包总容量的完全背包问题,其中由于最底层数均大于一,所以每个背包至少被装一次。

又由于背包最大有10^6,所以n应小于20

【代码】

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
int v[1000050];
int c[1000050];
using namespace std;
int length,top,total;
const int mod=1000000009;
void init(int n)
{
total=1;
memset(c,0,sizeof(c));
c[0]=1;
for(int i=1;i<=n;i++)
{
c[i]=c[i-1]*(n+1-i)/i;
total+=c[i];
} }
int main (void)
{
while(scanf("%d%d",&length,&top)==2)
{
if(length>20)
{
printf("0\n");
continue;
}
init(length-1);
if(top<total)
{
printf("0\n");
continue;
}
memset(v,0,sizeof(v));
v[0]=1;
for(int i=0;i<length;i++)
{
for(int j=c[i];j<=top-total;j++)
v[j]=(v[j]+v[j-c[i]])%mod;
} printf("%d\n",v[top-total]%mod);
}
return 0; }

最初想的是每一层的元素都是由该层第一个数决定,所以只需找出每层第一个数组成的排列种数,可是不会写代码,写了个递归可是组合数稍微大一点就慢死。

所以弱渣还是要多观察多思考。

SOJ 3531_Number Pyramids的更多相关文章

  1. Soj题目分类

    -----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...

  2. 【贪心】SOJ 13983

    SOJ 13983. Milk Scheduling 这是比赛题,还是作死的我最讨厌的英文题,题目大意就是有n头奶牛,要在喂奶截止时间前给他喂奶并得到相应的含量的牛奶. 一开始的想法就是挑选截止日期的 ...

  3. UVA 1362 Exploring Pyramids 区间DP

    Archaeologists have discovered a new set of hidden caves in one of the Egyptian pyramids. The decryp ...

  4. LA 3516(ZOJ 2641) Exploring Pyramids(递推 DP)

    Exploring Pyramids Archaeologists have discovered a new set of hidden caves in one of the Egyptian p ...

  5. IC封装图片认识(二):SOP&SOJ

    SOP SOP-EIAJ-TYPE-II-14L SSOP SSOP-16L TSOP(Thin Small Outline Package) TSSOP(Thin Shrink Outline Pa ...

  6. SOJ 1685:chopsticks(dp)

    题目链接 说实话挺喜欢soj的界面,简简单单,没有多余的东西hhh(但是简单到连内存限制,时间限制都看不到了. 题意是有个“奇葩”的主人公,吃饭要用三根筷子.两根短的一根长的. 现在给你n根筷子,要在 ...

  7. SOJ 4552 [期望,概率]

    题目链接:[http://acm.scu.edu.cn/soj/problem.action?id=4552] 题意:给你n种卡牌,每种卡牌有无限多个,每次从中抽取一张卡牌,问:1.集齐这n种卡牌需要 ...

  8. POJ 2208 Pyramids(求四面体体积)

    Description Recently in Farland, a country in Asia, a famous scientist Mr. Log Archeo has discovered ...

  9. soj 131 找题

    soj 131 找题 给出两个长度为n,都含k个1的字符串A,B.现在令\(a_1,a_2,\dots,a_k\)是A中1的下标,\(b_1,b_2,\dots,b_k\)是B中1的下表,然后将a,b ...

随机推荐

  1. c语言-依赖倒转

    当一个文件(aa.c文件)依赖于头文件(bb.h)时,如果bb.c编译之后形成的bb.o文件重新编译后,aa.o的文件不需要重新编译 aa.c文件: bb.h文件:对bb.c文件进行声明 bb.c文件 ...

  2. [BZOJ1009][HNOI2008]GT考试 DP+矩阵快速幂+KMP

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1009 我们令$dp(i,j)$表示已经填了$i$位,而且后缀与不幸运数字匹配了$j$位,那 ...

  3. mysql解压缩方式安装和彻底删除

    一.安装mysql (1)将下载下来的mysql压缩文件解压缩到需要安装mysql的目录中 (2)打开解压后的文件夹,复制default.ini文件并重命名为my.ini,此文件的相关配置为: (3) ...

  4. Elasticsearch--集群&时光之门和恢复控制

    节点发现 启动一个Elasticsearch节点时,该节点会开始寻找具有相同集群名字并且可见的主节点.如果找到主节点,该节点加入一个已经组成了的集群:如果没有找到,该节点成为主节点(如果配置允许).形 ...

  5. 解决VS2010提示warning C4068: 未知的杂注

    出现原因是#pragma声明问题,加上#pragma warning(disable:4068)即可 #pragma warning(disable:4068)#pragma execution_ch ...

  6. 读取.properties配置信息

    package com.ctcti.webcallcenter.utils; import java.io.FileInputStream;import java.io.FileNotFoundExc ...

  7. 使用Win7 64位旗舰版光盘映像安装Windows Home basic 64位操作系统

    工作当中需要安装Windows home basic 64位操作系统,苦于手头没有该版本的安装光盘,也没时间下载其安装映像.因此,在现有资源“cn_windows_7_ultimate_with_sp ...

  8. maven多模块项目,多web合并项目使用心得

    Fixflow,做中国最好的开源流程引擎!项目地址https://github.com/fixteam/fixflow 此文章适合maven初学者或想接触maven的用户,讲的只是皮毛,高手请自觉略过 ...

  9. swift派发机制的核心是确定一个函数能否进入动态派发列表

    swift派发机制的核心是确定一个函数能否进入动态派发列表

  10. Java入门第39课——猜字母游戏之实现字母生成方法

    问题        实现猜字母游戏中的字母生成方法,即,随机生成5个不同的字母作为猜测的结果. 方案        实现generate方法,首先声明一个字符类型的数组,用于存储26个大写字母,然后声 ...