#include <cstdio>
#include <vector>
#include <string.h>
using namespace std;
const int MOD = 1e9 + 7;
int dp[2001][2001];
int dfs(int a, int b, int k) {
if (a + b == 1) return dp[a][b] = 1;
if (a + b == k) {
if (a == k || b == k) return dp[a][b] = 0;
return dp[a][b] = 1;
}
if (dp[a][b] > 0) return dp[a][b];
int &res = dp[a][b];
res = 0;
for (int i = 0; i < k; i ++) if (a >= i && b >= k - i - 1) (res += dfs(a - i, b - (k - i - 1), k)) %= MOD;
return res;
}
int main() {
int n, m, k, ans = 0;
scanf("%d%d%d", &n, &m, &k);
memset(dp, -1, sizeof dp);
for (int i = n; i > 0; i -= k - 1) for (int j = m; j > 0; j -= k - 1) (ans += dfs(i, j, k)) %= MOD;
printf("%d\n", ans);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:25:36: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d%d%d", &n, &m, &k);
^