1. 程式人生 > >EOJ Monthly 2017.12 (暨 ECNU 12 月內部選拔)比昨天更多的棒棒糖 (Easy)

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

輸出答案模 998244353

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元時有多少種方案。
轉移似乎很簡單。。。結束。。
*/