数值微分(数学)(组合数)




看到题目我们有一个直观的想法,就是它的递推式很像组合数学中的杨辉三角。。。。

这样想的话很容易就能得出式子:
\[f[m](i)=\sum_{j=0}^{i}f(i-j)\times C_{m}^{j}\times (-1)^j\]

举个例子:
\(f[4](3)\)
\(=f[3](3)-f[3](2)\)
\(=f[2](3)-2\times f[2](2)+f[2](1)\)
\(=f[1](3)-3\times f[1](2)+3\times f[1](1)-f[1](0)\)
因为\(f[1](0)\)是0,可以转换为\(f[0](0)\)
所以原式
\(=f[0](3)-4\times f[0](2)+6\times f[0](1)-4\times f[0](0)\)

那么接下来就是求组合数的问题了。

求组合数的方法有很多种,这里借鉴maomao9173 dalao的总结:

  • 公式法 (这个复杂度很劣)
  • 阶乘逆元求法 适用于多次查询,复杂度预处理O( n+logn ),查询接近O( 1 ),但是模数必须是质数。(100007不是质数)
    (就是先O(n)预处理阶乘,然后算出来最大数的逆元,然后倒推回来。)
  • 杨辉三角递推求法 适用于多次密集小范围查询,复杂度预处理O( n^2 ),查询O( 1 )
    (比如说NOIP2016day2t1)
  • 费马小定理/exgcd求逆元 单次O( logn ),是最简单的方法,模数必须为质数
  • 阶乘分解求逆元 适用于高精度组合数计算,或者模数不为质数的求法。复杂度预处理O( nlogn ),查询O( 1 )

而这个题就是用阶乘分解求逆元(取模情况下)的方法来做。

\[C_m^j=\frac{m(m-1)...(m-j+1)}{j!}\]

上下分别分解质因数,由于j!中的质因子都不超过n,所以只分解出2到n之间的质因子就可以了。

分解之后分子分母先对分解的因子进行约分,组合数是整数所以约分之后分母必定全部消去,剩下的分子只需要乘法计算。

猜你喜欢

转载自www.cnblogs.com/fengxunling/p/9781572.html