10943 - How do you add?

Time limit: 3.000 seconds

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=show_problem&problem=1884

Larry is very bad at math - he usually uses a calculator, which worked well throughout college. Unforunately, he is now struck in a deserted island with his good buddy Ryan after a snowboarding accident. They're now trying to spend some time figuring out some good problems, and Ryan will eat Larry if he cannot answer, so his fate is up to you!

It's a very simple problem - given a number N, how many ways can Knumbers less than N add up to N?

For example, for N = 20 and K = 2, there are 21 ways:
0+20
1+19
2+18
3+17
4+16
5+15
...
18+2
19+1
20+0

Input

Each line will contain a pair of numbers  N  and  K .  N  and  K  will both be an integer from 1 to 100, inclusive. The input will terminate on 2 0's.

Output

Since Larry is only interested in the last few digits of the answer, for each pair of numbers  N  and  K , print a single number mod 1,000,000 on a single line.

Sample Input

20 2
20 2
0 0

Sample Output

21
21

首先题目的描述并不完整,本意是求:把N分解成K个非负整数有多少种分法。

思路:

1.  如何转化这一问题?——小球模型

这个问题可以等效成有N个相同的小球放到K个不同的盒子里,每个盒子可以为空,求一共多少种放置的方法。

2. 用何种方法求解?

可以这样理解, 我们把N个球用细线连成一排,再用K-1把刀去砍断细线,就可以把N个球按顺序分为K组(即分装到K个盒子中)。则N个球装入K个盒子的每一种装法都对应一种砍线的方法。而砍线的方法等于N个球与K-1把刀的排列方式。(注意可以让多把刀砍一根线)

故排列方法共有C(N+K-1,K-1)=C(N+K-1,N)种。

3. 如何计算?

由于要取模的原因,利用加法公式C(n+1,k+1)=C(n,k)+C(n,k+1)可以通过类似DP的递推形式求得结果。

完整代码:

/*0.012s*/#include <cstdio>
using namespace std;
const int mod = 1000000;int dp[101][101];int main(void)
{int i, j, n, k;for (i = 1; i <= 100; i++)dp[1][i] = 1;for (j = 2; j <= 100; j++){dp[j][1] = j;for (i = 2; i <= 100; i++)dp[j][i] = (dp[j - 1][i] + dp[j][i - 1]) % mod;///公式做了一些变形}while (scanf("%d%d", &n, &k), n)printf("%d\n", dp[k][n]);return 0;
}

UVa 10943 How do you add? (组合数学)相关推荐

  1. 训练指南第二章-基础问题

    训练指南第二章-基础问题 P170 2 / 4 Problem A UVA 10943 How do you add? 1 / 2 Problem B UVA 10780 Again Prime? N ...

  2. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  3. UVA 10954 - Add All

    http://uva.onlinejudge.org/external/109/10954.html 题意: 输入一串数据,拿出两个相加,把和放回去,再拿出两个相加,把和放回去--依次循环,最后找出最 ...

  4. UVA 11645 Bits(组合数学)

    从左往右处理,左半部分记为left, 右半部分记为right,若i,i -1均为1, 贡献为ans += (left + 1) + right * (1ll << (i - 1)); 否则 ...

  5. UVA 10910 Marks Distribution(组合数学 或 递推)

    题意:一个人N门课程的总成绩为T,每门课程的最低成绩为P,求一共有多少种可能的分配方法. 题解:可以先求出超出的部分 T = T - n*p:剩余的相当于n个里面每个科目放0,1分等. 这题我只懂了递 ...

  6. UVA - 11806 Cheerleaders(组合数学+容斥原理)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,现在有k个拉拉队员,要求在第一列.最后一列.第一行和最后一行至少有一个拉拉队员,注意以下要求: 四个角上的拉拉队员可以同时属于两条边 每个方格至多只 ...

  7. UVA 10954 Add All

    UVA_10954 看了别人解题报告之后发现累加的过程可以这样操作,每次取最小的两个元素加和,然后把和当作一个新元素放进集合,直到剩下一个元素,然后把中间结果加起来就是要求的结果.实际上这个题目就是哈 ...

  8. UVa 10954 Add All 贪心

    贪心   每一次取最小的两个数,注意相加的数也要算' #include<cstring> #include<iostream> #include<cstdio> # ...

  9. uva 10954——Add All

    <p>题意:给定一个序列,然后从中选择两个数,相加后放入原来的序列,消耗的费用为两个数 的和,问最小的代价.</p><p> </p><p>思 ...

最新文章

  1. python文本替换 数据库_Python pptx(Power Point)查找和替换文本(ctrl+H)
  2. python在化学方面的应用-python化学库
  3. DC workshop指导篇1- Setup and Synthesis Flow
  4. SpringMVC学习10之AJAX初体验和了解
  5. 学生档案管理系统(续)
  6. 超全面Python基础入门教程【十天课程】博客笔记汇总表
  7. html中前台布局特点,HTML5弹性布局有什么优点
  8. ajax不支持post,AJAX不能正确发送POST变量
  9. 关于Ajax工作原理
  10. python itertools combination_Python itertools.combinations 和 itertools.permutations 等价代码实现...
  11. python用户管理系统模块_Django的用户模块与权限系统的示例代码
  12. Ubuntu 18.04 国内源
  13. 如何在系统设置mysql环境变量(win11)
  14. 1068 万绿丛中一点红 (20 分)
  15. Cat源码分析(三):10种分析器
  16. Java验证辛钦大数定理
  17. python循环语句if语句的题目_Python if语句 for语句 while循环的练习
  18. Java培训出来什么水平?
  19. 通过gcloud创建Google Kubernetes Engine(GKE)并通过kubectl访问
  20. 三个月达到百万日活,梨视频如何借助云计算做最好看的资讯短视频?

热门文章

  1. SSP广告引擎(1)对接流程
  2. python 电路仿真spice_通过Python调用Spice-gtk
  3. oracle rac v3500_Oracle 11g RAC 二节点root.sh执行报错故障一例
  4. 基于springboot幼儿园管理系统
  5. 001_C#我的第一个串口上位机软件
  6. 职场中有哪些不成熟的表现
  7. 有哪些相见恨晚的高效学习方法?
  8. 数据结构课设实验一:图书信息管理系统
  9. 局域网下载控制好帮手--超级嗅探狗
  10. 小提琴1234567位置图解_小提琴指法图233(免费)