UVA 10943 How do you add?
2016-07-26 10:32
387 查看
题意:
给你n<=100,k<=100问你k个0~n之内的数相加等于n的方法数。
思路:
首先,建立个数学模型,把这问题转换成n个小球要放到k个桶中的方法数(可以存在桶为空的情况)。那么我们这里可以用插空法去做,因为存在桶为空的情况,那么我们只需在最后多加上k-1个空去选择就好了,答案为C(n+k-1,k-1),打表处理下。
#include<cstdio>
typedef long long LL;
const LL MOD=1e6;
const int MAX=205;
LL C[MAX][MAX];
void init(){
for(int i=0;i<MAX;i++){
for(int j=0;j<=i;j++){
if(j==0||j==i) C[i][j]=1;
else C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
}
}
int main(){
init();
int n,k;
while(~scanf("%d%d",&n,&k)&&(n!=0||k!=0)){
printf("%lld\n",C[n+k-1][k-1]);
}
return 0;
}
给你n<=100,k<=100问你k个0~n之内的数相加等于n的方法数。
思路:
首先,建立个数学模型,把这问题转换成n个小球要放到k个桶中的方法数(可以存在桶为空的情况)。那么我们这里可以用插空法去做,因为存在桶为空的情况,那么我们只需在最后多加上k-1个空去选择就好了,答案为C(n+k-1,k-1),打表处理下。
#include<cstdio>
typedef long long LL;
const LL MOD=1e6;
const int MAX=205;
LL C[MAX][MAX];
void init(){
for(int i=0;i<MAX;i++){
for(int j=0;j<=i;j++){
if(j==0||j==i) C[i][j]=1;
else C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
}
}
int main(){
init();
int n,k;
while(~scanf("%d%d",&n,&k)&&(n!=0||k!=0)){
printf("%lld\n",C[n+k-1][k-1]);
}
return 0;
}
相关文章推荐
- 编译预处理
- Menu菜单
- RFID Hacking④:使用ProxMark3 破解门禁
- LeetCode--Binary Tree Traversal ( Inorder, Preorder, PostOrder)
- WordPress查询文章作者的文章数及WordPress用户角色/权限
- ThreadPoolManager
- 持久化修改Android模拟器的system分区
- String 和StringBuffer,StringBuilder的区别
- POJ-2524-Ubiquitous Religions
- 游戏编程中的人工智能技术-扫雷机系列
- Codevs 1074 食物链 2001年NOI全国竞赛
- Android 模仿微信长按录音功能
- 数据结构实验之二叉树五:层序遍历
- JavaScript从0开始构思表情插件
- CentOS 下安装 Memcache
- Linux下登录Oracle命令行时删除键^H解决方法
- 简单工厂模式---(2)
- Python 命令行输出的颜色设置
- codeforces 554C Kyoya and Colored Balls 【组合数学+费马小定理】
- ARM学习笔记(一)