傳送門:cf 478d
給定紅綠兩種磚塊,問搭成的塔層數最高的情況下一共有多少種不同的情況,每一層的顏色必須相同。塔自上向下每層塊數爲1,2,3,4……
dp,首先通過兩種磚塊的和求出最高的層數。dp[i][j]表示i層用j塊紅磚的情況數,轉移方程
dp[i][j]=(dp[i][j]+dp[k][j-i])(0<=k<=i-1)
需要用到的是所有j+g>=(n層塊數)的j
/******************************************************
* File Name: d.cpp
* Author: kojimai
* Create Time: 2014年10月24日 星期五 15時38分37秒
******************************************************/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define FFF 200005
#define mod 1000000007
int f[FFF];
int findn(int x) {
int l = 1, r = 1000, mid;
while(l <= r) {
mid = (l + r) >> 1;
if((mid * (mid + 1) / 2)>x)
r = mid - 1;
else
l = mid + 1;
}
return r;
}
int main()
{
int r,g;
cin>>r>>g;
int n = findn(r + g);//找出最高的層數
memset(f,0,sizeof(f));
f[0] = 1;
for(int i = 1; i <= n; i++) {//加上了第i層之後求紅塊用了j塊一共有多少種情況
for(int j = r; j >= i; j--) {
f[j] += f[j-i]; //當前層用了j,i-1層需要j-i塊
if(f[j] >= mod)
f[j] -= mod;
}
}
int ans = 0;
for(int j = r; j + g >= n*(n+1)/2 && j >= 0; j--) {
ans += f[j];
ans %= mod;
}
cout<<ans<<endl;
return 0;
}