In TCS codevita-2016 round 2 there was a question in which we need to calculate sum of even binomial coefficients like**(\binom{n}{0}+\binom{n}{2}+\binom{n}{4}+\binom{n}{6}+…+\binom{n}{k})mod 10^{9}+7** where **n** and **k** can be upto 10^{14} and **k<n**.

ans= 2^(n-1)

that will be the answer when k is equal to n but I have clearly stated in question that k is less than n.

@srd091 Did anyone solve the problem during the contest or are there any solutions published by the author?

@pranavarora the author did not publish any solution or editorial, and I don’t know the number of contestants who solved this problem.

My friend’s friend solved this problem and he said he solved it considering **n<=10^5** instead of **n<=10^9**, pre-computed the factorial.

Here’s the code which is similar to what he said.

https://stackoverflow.com/questions/44962912/the-vita-sum-programming

Clearly,

In addition, if n = q_1 p + r_1 and k = q_2 p + r_2 (0 \le r_1, r_2 < p), then by Lucas theorem we have

So, we only need to compute the sum

where 0 \le k \le n < p.

In fact, this summation can be computed in O(\sqrt{p} \log p) time by using FFT/NTT.

Let v := \lfloor\sqrt{k}\rfloor, f_m(x) := \prod_{i=1}^{m}(x+i) and g_m(x) := \sum_{i=1}^{m} \left(\prod_{j=1}^{i-1}(n+1-j-x) \cdot \prod_{j=i}^{m} (x+j)\right). Then,

So, it suffices to evaluate f_v(iv), f_v(n-(i+1)v) and g_v(iv) for 0 \le i < v in O(\sqrt{k} \log{k}) time. (The last binomial sum can be computed in O(\sqrt{k} + \log{p}) time with those values.)

Firstly, the polynomials f_m(x) and g_m(x) satisfies the following recurrences

Secondly, by Lagrange interpolation and FFT, we can compute the values f(ai+c) (0 \le i \le \deg{f}) from f(ai+b) (0 \le i \le \deg{f}) in O(\textrm{M}(\deg{f})) time. (see https://specfun.inria.fr/bostan/publications/BoGaSc07.pdf.)

Therefore, we can compute the values f_{2m}(0), \ldots, f_{2m}(2mv) and g_{2m}(0), \cdots, g_{2m}(2mv) from f_{m}(0), \ldots, f_{m}(mv) and g_m(0), \ldots, g_m(mv) in O(m \log m) time. In addition, f_{2m+1}(*) and g_{2m+1}(*) can be computed from f_{2m}(*) and g_{2m}(*) in O(m + \log{p}) time. Thus, we can compute the binomial sum modulo prime in O(\sqrt{p} \log{p}) time.

[Updated]

It takes about 0.13 seconds on ideone to compute

(C++ implementation: https://ideone.com/Q3e3Wo)