#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>
using namespace std;
typedef long long LL;
const int maxn = 4005;
const int maxm = 2005;
const int mod = 1e9+7;
int dp[maxm],op[maxn],n,m,K,ans;
int main()
{
#ifdef Amberframe
freopen("agc009e.in","r",stdin);
freopen("agc009e.out","w",stdout);
#endif
scanf("%d %d %d",&n,&m,&K);op[0]=1;
for (int j=0;j<=m;j++) dp[j]=1;
for (int i=1;i<=(n+m-1)/(K-1);i++)
{
for (int j=m;j>=K;j--) (dp[j]-=dp[j-K])%=mod;
for (int j=max(0,i*(K-1)-n+1);j<=m;j++)
if ((m-j)%(K-1)==0) ans=((LL)ans+dp[j]-op[j])%mod;
for (int j=0;j<=m;j++) op[j]=dp[j];
for (int j=1;j<=m;j++) (dp[j]+=dp[j-1])%=mod;
}
printf("%d",ans<0?ans+mod:ans);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:21:28: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d %d %d",&n,&m,&K);op[0]=1;
^