其他分享
首页 > 其他分享> > D. Red-Green Towers(再次记录dp题)

D. Red-Green Towers(再次记录dp题)

作者:互联网

 

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

There are r red and g green blocks for construction of the red-green tower. Red-green tower can be built following next rules:

 

Let h be the maximum possible number of levels of red-green tower, that can be built out of r red and g green blocks meeting the rules above. The task is to determine how many different red-green towers having h levels can be built out of the available blocks.

Two red-green towers are considered different if there exists some level, that consists of red blocks in the one tower and consists of green blocks in the other tower.

You are to write a program that will find the number of different red-green towers of height h modulo 109 + 7.

Input

The only line of input contains two integers r and g, separated by a single space — the number of available red and green blocks respectively (0 ≤ r, g ≤ 2·105, r + g ≥ 1).

Output

Output the only integer — the number of different possible red-green towers of height h modulo 109 + 7.

Examples

input

Copy

4 6

output

Copy

2

input

Copy

9 7

output

Copy

6

input

Copy

1 1

output

Copy

2

Note

The image in the problem statement shows all possible red-green towers for the first sample.

这题我是做出了90%了,就差最后一下,犯了细节小错误,一直在wa,不得不去百度了题解。。。

设dp[i][j]为前i层,用了j个红色时的方案数。先通过i*(i+1)/2<=(r+g)预处理最大的层数n,然后开始dp。

简单想想就可以推出转移方程了。

枚举当前i层,要么选择填i个绿色的:if((i-1)*i/2+i-j<=g)    dp[j]+=f[j];

要么选择填i个红色的         if(j-i>=0)    dp[j]=(dp[j]+f[j-i])%mod;

AC代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=2e5+10;
ll dp[N],f[N];
int main(){
	ll r,g;
	cin>>r>>g;
	int n;
	for(int i =1000;;i--){
		if(i*(i+1)/2<=(r+g)){
			n=i;break;
		}
	}
	int cur=0;
	bool flag=1;
	dp[0]=1;
	for(int i=1;i<=n;i++){
		for(int j=0;j<=r;j++) {
			f[j]=dp[j];
			dp[j]=0;
		}
		
		for(int j=0;j<=r;j++){
			if((i-1)*i/2+i-j<=g)	dp[j]+=f[j];
			if(j-i>=0) 	dp[j]=(dp[j]+f[j-i])%mod;
		}
	}
	ll ans=0;
	for(int i=0;i<=r;++i) {
		ans=(ans+dp[i])%mod;
	}
	printf("%lld\n",ans);
}

 

标签:blocks,Towers,dp,green,Red,input,Green,tower,red
来源: https://blog.csdn.net/qq_41286356/article/details/95060291