EOJ Monthly 2017.12 (暨 ECNU 12 月内部选拔)比昨天更多的棒棒糖 (Easy)

3448. 比昨天更多的棒棒糖 (Easy)

Time limit per test: 2.0 seconds

Memory limit: 512 megabytes

唐纳德先生的某女性朋友最近与唐纳德先生同居。该女性朋友携带一 baby。该 baby 酷爱吃棒棒糖,且有一个奇怪的特性:今天吃的棒棒糖一定要比昨天的棒棒糖更多,至少要一样多。如果棒棒糖少了,baby 就会很不高兴;另外如果有连续  k  天棒棒糖的数量都是一样的,baby 也会很不高兴。

唐纳德先生发现他的口袋里只有可怜的  n  元钱,他可以用  1  元钱买  1  根棒棒糖。他想用这些钱逗 baby 开心,这些钱可以不花完。他可以从某一天开始再也不买棒棒糖,把他的女性朋友和 baby 一起送回家;但是他绝对不能让 baby 不高兴,否则他的女性朋友可能对他做一些不和谐的事情。

唐纳德先生想要知道,他总共有多少种买棒棒糖的方案,两种方案不相同当且仅当总天数不相同,或者某一天买的棒棒糖数量不相同。唐纳德先生知道这个问题对于聪明的你实在是太简单了,所以他加了一个附加条件:他第一天必须买棒棒糖,而且至少买  x  根棒棒糖。

Input

一行三个整数  n,x,k

数据范围约定:

  • 对于 Easy 档: 1n,x100,2k100
  • 对于 Hard 档: 1n,x104,2k104

Output

输出答案模  998 244 353

Examples

input
3 1 2
output
4
input
1 1 2
output
1
input
4 2 3
output
4

Note

样例 1:

有四种方案:

  • 第一天 1;
  • 第一天 2;
  • 第一天 3;
  • 第一天 1,第二天 2;

注意第一天和第二天都买 1 是不行的,因为连续两天棒棒糖数量一样,baby 就会很不高兴。


#include <bits/stdc++.h>
using namespace std;
#define modo 998244353
long long dp[101][101][101];
int main(){
	int n, x, k;
	cin>>n>>x>>k;
	long long ans = 0;
	memset(dp, 0, sizeof(dp));
	for(int i = x; i <= n; ++i){
		dp[i][i][1] = 1;
		ans++;
		for(int j = x; j < i; ++j){
			for(int l = x; l < j; ++l){
				for(int z = 1; z <= k; ++z){
					dp[i][j][1] += dp[i - j][l][z];
					dp[i][j][1] %= modo;
				}
			}
			ans += dp[i][j][1];
			ans %= modo;
			for(int z = 2; z < k; ++z){
				dp[i][j][z] += dp[i - j][j][z - 1];
				dp[i][j][z] %= modo;
				ans += dp[i][j][z];
				ans %= modo;
			}
		}
	}
	cout<<ans<<endl;
}

/*
题意:
一共n元,每天需要买糖果给宝宝吃,且至少大于等于前一天的量,第一天最少为x,问有多少种购买方案。

思路:
说实话。。。写一个n^4方dp感觉很丢人。。dp[i][j][k]表示花了i元,当天花j元,这是k天花了j元时有多少种方案。
转移似乎很简单。。。结束。。
*/


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值