题意:计算C(n,0)~C(n,m)的和 ,文中我们用S(n,m)表示
题解给的莫队做法,也就是说我们可以从一个S(n,m) 可以知道S(n - 1,m)、S(n + 1,m)、S(n,m - 1)、S(n,m + 1),如果可以实现这个的话,我们就可以用莫队算法,现在我们来推导一下
S(n,m) = C(n,0) + C(n,1) + C(n,2) +...... + C(n,m - 1) + C(n,m)
从上式中我们不难看出S(n,m) = S(n,m - 1) + C(n,m),因为S(n,m - 1) = C(n,0) + C(n,1) + C(n,2) +...... + C(n,m - 1)
ok!我们从这个式子中我们就可以完成S(n,m)变成S(n,m - 1)或者S(n,m + 1)这两种情况
也就是S(n,m - 1) = S(n,m) - C(n,m),S(n,m + 1) = S(n,m) + C(n,m + 1)
接着我们根据组合数的递推公式C(n,m) = C(n - 1,m) + C(n - 1,m - 1)我们可以推出
S(n,m) = C(n,0) + C(n,1) + C(n,2) +...... + C(n,m)
S(n,m) = C(n - 1,0) + (C(n - 1,1) + C(n - 1,0))+ (C(n - 1,2) + C(n-1,1)) +...... + (C(n - 1,m) + C(n - 1,m - 1))
我们整理一下
S(n,m) = 2 * (C(n - 1,0) + C(n - 1,1) + C(n - 1,2) + ....... + C(n - 1,m - 1)) + C(n - 1,m)
S(n,m) = 2 * S(n-1,m) - C(n - 1,m)
ok!我们从这个式子中我们就可以完成S(n,m)变成S(n - 1,m)或者S(n + 1,m)这两种情况
也就是S(n - 1,m) = (S(n,m) + C(n - 1,m)) / 2,S(n + 1,m) = 2 * S(n,m) - C(n,m)
综上整理:
①S(n,m - 1) = S(n,m) - C(n,m)
②S(n,m + 1) = S(n,m) + C(n,m + 1)
③S(n - 1,m) = (S(n,m) + C(n - 1,m)) / 2
④S(n + 1,m) = 2 * S(n,m) - C(n,m)
这样我们就完成了因为题目给的n,m为1e5所以计算C(n,m)时要预先处理好否者会TLE
剩下的就是套一个莫队算法就可以了,离线输出答案
代码:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include