这里 t 只会达到 O(\frac{n+m}{k-1}) 级别, s 可以达到 O\big(n\big) 级别。
于是复杂度为 O\big((n+m)^2/k\big)。
#include<algorithm>
#include<cstdio>
#define MaxN 2050
using namespace std;
const int mod=1000000007;
int n,m,k,ans,dp[MaxN<<1][MaxN][2],o[MaxN];
int main()
{
scanf("%d%d%d",&n,&m,&k);
dp[0][0][0]=1;
for (int t=1;t<=(n+m)/(k-1);t++){
o[0]=(dp[t-1][0][0]+dp[t-1][0][1])%mod;
for (int s=1;s<=n;s++)
o[s]=((long long)o[s-1]+dp[t-1][s][0]+dp[t-1][s][1])%mod;
for (int s=0;s<=n;s++){
dp[t][s][0]=(dp[t-1][s][0]+dp[t-1][s][1])%mod;
if (s-k<0)dp[t][s][1]=o[s-1];
else dp[t][s][1]=(o[s-1]-o[s-k])%mod;
if (s%(k-1)==n%(k-1)&&1+t*(k-1)-s<=m&&(1+t*(k-1)-s)%(k-1)==m%(k-1))
ans=(ans+dp[t][s][1])%mod;
}
}printf("%d",(ans+mod)%mod);
return 0;
}