CodeForces-712D Memory and Scores(計數)

D. Memory and Scores

time limit per test

2 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

Memory and his friend Lexa are competing to get higher score in one popular computer game. Memory starts with score a and Lexa starts with score b. In a single turn, both Memory and Lexa get some integer in the range [ - k;k] (i.e. one integer among  - k,  - k + 1,  - k + 2, ...,  - 2,  - 1, 0, 1, 2, ..., k - 1, k) and add them to their current scores. The game has exactly t turns. Memory and Lexa, however, are not good at this game, so they both always get a random integer at their turn.

Memory wonders how many possible games exist such that he ends with a strictly higher score than Lexa. Two games are considered to be different if in at least one turn at least one player gets different score. There are (2k + 1)2t games in total. Since the answer can be very large, you should print it modulo 109 + 7. Please solve this problem for Memory.

Input

The first and only line of input contains the four integers abk, and t (1 ≤ a, b ≤ 100, 1 ≤ k ≤ 1000, 1 ≤ t ≤ 100) — the amount Memory and Lexa start with, the number k, and the number of turns respectively.

Output

Print the number of possible games satisfying the conditions modulo 1 000 000 007 (109 + 7) in one line.

Examples

input

Copy

1 2 2 1

output

Copy

6

input

Copy

1 1 1 2

output

Copy

31

input

Copy

2 12 3 1

output

Copy

0

Note

In the first sample test, Memory starts with 1 and Lexa starts with 2. If Lexa picks  - 2, Memory can pick 0, 1, or 2 to win. If Lexa picks  - 1, Memory can pick 1 or 2 to win. If Lexa picks 0, Memory can pick 2 to win. If Lexa picks 1 or 2, Memory cannot win. Thus, there are 3 + 2 + 1 = 6 possible games in which Memory wins.

 

#include <bits/stdc++.h>
#define id(x) mid + x
using namespace std;
typedef long long LL;

const int MX = 1e3 + 5;
const int MM = MX * 205;
const int mod = 1e9 + 7;

LL dp1[MM], dp2[MM];
LL sum1[MM], sum2[MM];
int mid = MM / 2;

int main() {
    //freopen ("in.txt", "r", stdin);
    int a, b, k, n;
    cin >> a >> b >> k >> n;

    dp1[id (a)] = 1;
    dp2[id (b)] = 1;


    for (int i = 1; i <= n; i++) {
        int l = min (a, b) - k * i, r = max (a, b) + k * i;
        for (int j = 1; j < MM; j++) {
            sum1[j] = sum1[j - 1] + dp1[j];
            if (sum1[j] >= mod) sum1[j] -= mod;
            sum2[j] = sum2[j - 1] + dp2[j];
            if (sum2[j] >= mod) sum2[j] -= mod;
        }
        for (int j = l; j <= r; j++) {
            dp1[id (j)] = sum1[id (j + k)] - sum1[id (j - k) - 1];
            if (dp1[id (j)] < 0) dp1[id (j)] += mod;
            dp2[id (j)] = sum2[id (j + k)] - sum2[id (j - k) - 1];
            if (dp2[id (j)] < 0) dp2[id (j)] += mod;
        }
    }
    for (int j = 1; j < MM; j++) {
        sum1[j] = sum1[j - 1] + dp1[j];
        if (sum1[j] >= mod) sum1[j] -= mod;
        sum2[j] = sum2[j - 1] + dp2[j];
        if (sum2[j] >= mod) sum2[j] -= mod;
    }
    LL ans = 0;
    for (int i = 1; i < MM; i++) {
        ans += dp1[i] * sum2[i - 1] % mod;
        if (ans >= mod) ans -= mod;
    }
    cout << ans << endl;
    return 0;
}

 

發佈了291 篇原創文章 · 獲贊 104 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章