【NOI2015模拟8.17】最短路(shortest)

题目

http://172.16.0.132/senior/#contest/show/2068/2

小结

我们发现每个点的点权就是点(0,0)到这个点的方案数。
就是Cn,m。
所以,答案就是

m+1+i=1nCi+n,i

但是,我们不能够算这么多次,所以,我们知道一个公式:
Cn,m+Cn,m1=Cn+1,m

所以,我们一开始加上一个C1+n,0,
于是,原数列就变成Cm+n+1,n
然后就用到逆元:
ap11(modp)()

apa(modp)

ap21a(modp)

bap2ba(modp)

所以,排列组合公式Cn,m= n!m!(nm)!
于是,这条公式就可以变成 n!m!(nm)!p21 就好了~

#include<iostream>
#include<cstring>
using namespace std;
long long n,m,ans,a,b,mo;
long long ksm(long long a,long long b,long long n)
{
    long long t,y;
    t=1; 
    y=a;
    while (b!=0)
    {
        if (b&1==1) t=t*y%n;
        y=y*y%n; 
        b=b>>1;
    }
    return t;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    if (n>m)
    {
        long long t=n;
        n=m;
        m=t;
    }
    mo=1000000007;
    ans=(m+1)%mo;
    long long i;
    a=1;
    b=1;
    for (i=m+n+1;i>=m+2;--i)
        a=(a*i)%mo;
    for (i=n;i>=1;--i)
        b=(b*i)%mo;
    ans=(ans+(a*(ksm(b,mo-2,mo)%mo))%mo)%mo-1;
    printf("%lld\n",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值