Problem:
Score : 400 points

Problem Statement

We have N+1 integers: 10^{100}, 10^{100}+1, ..., 10^{100}+N.

We will choose K or more of these integers. Find the number of possible values of the sum of the chosen numbers, modulo (10^9+7).

Constraints

1 \leq N \leq 2\times 10^5

1 \leq K \leq N+1

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N K

Output

Print the number of possible values of the sum, modulo (10^9+7).

Sample Input 1

3 2

Sample Output 1

10

The sum can take 10 values, as follows:

(10^{100})+(10^{100}+1)=2\times 10^{100}+1

(10^{100})+(10^{100}+2)=2\times 10^{100}+2

(10^{100})+(10^{100}+3)=(10^{100}+1)+(10^{100}+2)=2\times 10^{100}+3

(10^{100}+1)+(10^{100}+3)=2\times 10^{100}+4

(10^{100}+2)+(10^{100}+3)=2\times 10^{100}+5

(10^{100})+(10^{100}+1)+(10^{100}+2)=3\times 10^{100}+3

(10^{100})+(10^{100}+1)+(10^{100}+3)=3\times 10^{100}+4

(10^{100})+(10^{100}+2)+(10^{100}+3)=3\times 10^{100}+5

(10^{100}+1)+(10^{100}+2)+(10^{100}+3)=3\times 10^{100}+6

(10^{100})+(10^{100}+1)+(10^{100}+2)+(10^{100}+3)=4\times 10^{100}+6

Sample Input 2

200000 200001

Sample Output 2

1

We must choose all of the integers, so the sum can take just 1 value.

Sample Input 3

141421 35623

Sample Output 3

220280457

Solution in C++ (GCC 9.2.1) (judge verdict: Runtime Error)

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

void find(int* arr,int n,int k,bool* vis,set<int>& s,int num,int idx,int** dp){
	
	if(idx>=k){
		if(s.find(num)==s.end()){
			s.insert(num);
		}
	}
	if(idx==n){
		return;
	}
	if(dp[idx][num]!=0){
		return ;
	}
	for(int i=0;i<=n;i++){
		if(vis[i]==false){
			vis[i]=true;
			find(arr,n,k,vis,s,num+arr[i],idx+1,dp);
			vis[i]=false;
		}
	}
	dp[idx][num]=1;
	return;
}
int main() {
	// your code goes here
	int n,k;
	cin>>n>>k;
	int* arr=new int[n+1];
	bool* vis=new bool[n+1];
	int tsum=0;
	for(int i=0;i<=n;i++){
		vis[i]=false;
		arr[i]=i+1;
		tsum+=arr[i];
	}
	int** dp=new int*[n+2];
	for(int i=0;i<=n+1;i++){
		dp[i]=new int[tsum+1];
		for(int j=0;j<=tsum;j++){
			dp[i][j]=0;
		}
	}
	set<int>s;
	find(arr,n+1,k,vis,s,0,0,dp);
	cout<<s.size();
	return 0;
}