博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ1942 Paths on a Grid 一种求单个组合数的方法
阅读量:4046 次
发布时间:2019-05-25

本文共 983 字,大约阅读时间需要 3 分钟。

题目大意

给你一个n*m的矩阵,最开始在左上角,只能向下或者向右,求,从左上走到右下的所有路线的方案数。

不难发现,需要走n+m步,然后从n+m中挑出n个走下,即答案就是
C m + n n C_{m+n}^{n} Cm+nn

但是!

本题的询问较多,且差距较大,是无法通过递推得到的。
所以就要利用一种求单个组合数的方法。

思路

C n k C_{n}^{k} Cnk的本质是 Π n − k + 1 n \Pi_{n-k+1}^{n} Πnk+1n ÷ \div ÷ Π 1 k \Pi_{1}^{k} Π1k

所以我们把它当成k个 分数 乘起来就好了。(分子分母分别乘可能会爆longlong)
即ans= n k ∗ n − 1 k − 1 ∗ n − 2 k − 2 ∗ . . . ∗ n − k + 1 1 \cfrac{n}{k}*\cfrac{n-1}{k-1}*\cfrac{n-2}{k-2}*...*\cfrac{n-k+1}{1} knk1n1k2n2...1nk+1
由于浮点数可能会产生误差,所以最终结果要加上0.5再取整

代码

#include
#include
#include
using namespace std;int n,m;unsigned calc(unsigned n,unsigned m){
double ans=1.0,a=(double)m+n,b=(double)min(n,m); while(b){
ans*=a/b; a--;b--; } ans+=0.5; return (unsigned)ans;}int main(){
while(~scanf("%d%d",&n,&m)){
if(!m&&!n) break;//结束条件 printf("%u\n",calc(n,m)); } return 0;}

芭芭拉冲鸭!

在这里插入图片描述
“人们都在沉醉,人们都已忘却,人们都装作看都这结尾,一味陷入争辩,无人聆听箴言,该可悲可泣或改叹可怜。”–《绝体绝命》(阿良良木健/洛天依)

转载地址:http://luuci.baihongyu.com/

你可能感兴趣的文章
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
flex4 中创建自定义弹出窗口
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-18. 各种循环语句的区别和应用场景
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
socket,accept函数解析
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>