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

xiaoxiao2021-02-28  101

题目

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); }
转载请注明原文地址: https://www.6miu.com/read-54794.html

最新回复(0)