2017.08.06【NOIP提高组】模拟赛B组

T1:暴力dg(反着枚举),再加一个小小的剪枝:先维护一个前缀和,每次dg时判断一下若当前的重量加上剩下的所有重量还小于等于以求出的最大重量,那么就不往下搜了。


T2:分层SPFA。


总结:在做分层SPFA时,dis,bz,d这三个数组的形式一定要一模一样,否则会出现错误或超时。


T3:设n>=m,那么最优解一定是先走长度为n这条边,再走长度为m的这条边。

长度为n的这条边上的点的权值一定为1,这个很好求。关键是怎样求长度为m的这条边的答案。

长度为m的这条边的答案就是sum(f[n+1][i])(1<=i<=m+1),这就相当于从(1,1)走到(n+2,m+1)的方案数-1,而从(1,1)走到(n+2,m+1)的方案数为C(m,n+m+1)(一共要横着走m步,竖着走n+1步),结合上长度为n的这条边的答案,那么最终答案就是n+C(m,n+m+1),那么怎样求C(m,n+m+1)呢?

因为答案很大,我们又不能边除边模,所以我们考虑逆元思想。

因为1000000007是一个质数,所以根据费马小定理,就有(a^(p-1))%p=1

即(a^(p-2))%p=(1/a)%p

所以我们如果要求一个数除以a的商模p的结果,也就是求那个数乘a^(p-2)模p的结果,这个我们可以用快速幂解决。


总结:

1、要记住逆元的求法。

2、组合数有一个公式:C(m-1,n)+C(m,n)=C(m+1,n+1)

你可能感兴趣的:(【初中部,NOIP提高组,】模拟赛B)