考虑a+b的最优情况,那么最大层数刚好为:sqrt(2*(a+b))。
有可能由于a与b相差较大,则不能到达这个理论最大层数,但是没有关系,我们在dp过程中,保证当前每一步的转移是合法的,则最后倒序枚举合法的最大层数即可。
对于dp状态的解释,写在了注释中。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=4e5+5,MOD=1e9+7;
int a,b,n;
int f[2][N],sum[N];
signed main(){
scanf("%lld%lld",&a,&b);
n=sqrt(2*(a+b));
f[0][0]=1;
for (register int i=1; i<=n; ++i)
{
int m=min(i*(i+1)/2,a);
for (register int j=0; j<=m; ++j)
{
if (i<=j) f[i&1][j]+=f[(i-1)&1][j-i];
if (i*(i+1)/2-j<=b) f[i&1][j]+=f[(i-1)&1][j];
f[i&1][j]%=MOD;
}
for (register int j=0; j<=m; ++j) sum[i]+=f[i&1][j];
sum[i]%=MOD;
for (register int j=0; j<=m; ++j) f[(i-1)&1][j]=0;
}
for (register int i=n; i>=1; --i)
if (sum[i])
{
printf("%lld\n",sum[i]);
break;
}
return 0;
}