Program to find sum of the given sequence

Given two numbers N and K. The task is to find the sum of the sequence given below.

(1*2*3*…*k) + (2*3*…*k*(k+1)) + (3*4*..*(k+1)*(k+2)) +…..+((n-k+1)*(n-k+2)*…*(n-k+k)).

Since the output can be large, print the answer under modulo 10^9+7.

Examples:

Input : N = 3, K = 2
Output : 8

Input : N = 4, K = 2
Output : 20


Let us take the given example and try to reduce it to a general formula.

In the given example for n = 3 and k=2,

Sum = 1*2 + 2*3 

We know that:
 $1\times2=2!\times 0!$\\ $2\times3=3!\times1!$\\

So each term is of the form:

    $$\frac{x!}{\left(x-k\right)!}$$

If we multiply and divide by k!, it becomes

    $$k!\cdot\frac{x!}{\left(x-k\right)!\cdot k!}$$

Which is nothing but,
 $k!\times$ ${N}\choose{k}$\\

Therefore,
sum = $k\times \sum_{x=k}^{n}$ $ {x}\choose{k}$ =$ {n+1}\choose{k+1}$ $\times k! $\\

But since n is so large we can not calculate it directly, we have to simplify the above expression.

On Simplifying we get,

     $$\frac{\left(n\right) \cdot \left(n-1\right) \cdot \left(n-2\right) \dots \left(n-k+1\right)}{k+1}$$

Below is the implementation of the above idea:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find the sum of the
// given sequence
  
#include <bits/stdc++.h>
using namespace std;
  
const long long MOD = 1000000007;
  
// function to find moudulo inverse
// under 10^9+7
long long modInv(long long x)
{
    long long n = MOD - 2;
    long long result = 1;
    while (n) {
        if (n & 1)
            result = result * x % MOD;
        x = x * x % MOD;
        n = n / 2;
    }
      
    return result;
}
  
// Function to find the sum of the 
// given sequence
long long getSum(long long n, long long k)
{
    long long ans = 1;
      
    for (long long i = n + 1; i > n - k; i--)
        ans = ans * i % MOD;
    ans = ans * modInv(k + 1) % MOD;
      
    return ans;
}
  
// Driver code
int main()
{
    long long n = 3, k = 2;
      
    cout<<getSum(n,k);
      
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to find the sum of the 
// given sequence 
  
class GFG {
  
    static long MOD = 1000000007;
  
// function to find moudulo inverse 
// under 10^9+7 
    static long modInv(long x) {
        long n = MOD - 2;
        long result = 1;
        while (n > 0) {
            if ((n & 1) > 0) {
                result = result * x % MOD;
            }
            x = x * x % MOD;
            n = n / 2;
        }
  
        return result;
    }
  
// Function to find the sum of the 
// given sequence 
    static long getSum(long n, long k) {
        long ans = 1;
  
        for (long i = n + 1; i > n - k; i--) {
            ans = ans * i % MOD;
        }
        ans = ans * modInv(k + 1) % MOD;
  
        return ans;
    }
  
// Driver code 
    public static void main(String[] args) {
        long n = 3, k = 2;
        System.out.println(getSum(n, k));
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find the sum 
# of the given sequence
  
MOD = 1000000007;
  
# function to find moudulo inverse
# under 10^9+7
def modInv(x):
  
    n = MOD - 2;
    result = 1;
    while (n):
        if (n&1):
            result = result * x % MOD;
        x = x * x % MOD;
        n = int(n / 2);
      
    return result;
  
# Function to find the sum of 
# the given sequence
def getSum(n, k):
  
    ans = 1;
      
    for i in range(n + 1, n - k, -1):
        ans = ans * i % MOD;
    ans = ans * modInv(k + 1) % MOD;
      
    return ans;
  
# Driver code
n = 3;
k = 2;
      
print(getSum(n,k));
      
# This code is contributed by mits

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to find the sum of the
// given sequence
using System;
  
   
  
// function to find moudulo inverse
// under 10^9+7
class gfg
{
    public long MOD = 1000000007;
 public long modInv(long x)
 {
    long n = MOD - 2;
    long result = 1;
    while (n >0) {
        if ((n & 1) > 0)
            result = result * x % MOD;
        x = x * x % MOD;
        n = n / 2;
    }
      
    return result;
}
  
// Function to find the sum of the 
// given sequence
  public long getSum(long n, long k)
  {
    long ans = 1;
      
    for (long i = n + 1; i > n - k; i--)
        ans = ans * i % MOD;
    ans = ans * modInv(k + 1) % MOD;
      
    return ans;
 }
}
  
// Driver code
class geek
{
  public static int Main()
 {
     gfg g = new gfg();
    long n = 3, k = 2;
      
    Console.WriteLine(g.getSum(n,k));
      
    return 0;
 }
}
//This code is contributed by SoumikMondal

chevron_right


PHP

$n – $k; $i–)
$ans = $ans * $i % $MOD;
$ans = $ans * modInv($k + 1) % $MOD;

return $ans;
}

// Driver code
$n = 3; $k = 2;

echo getSum($n, $k);

// This code is contributed
// by Akanksha Rai
?>

Output:

8


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.