EOJ Monthly 2017.12 (暨 ECNU 12 月內部選拔)比昨天更多的棒棒糖 (Easy)
阿新 • • 發佈:2019-02-08
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 檔:1≤n,x≤100,2≤k≤100。
- 對於 Hard 檔:1≤n,x≤104,2≤k≤104。
Output
輸出答案模 998244353。
Examples
input3 1 2output
4input
1 1 2output
1input
4 2 3
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元時有多少種方案。 轉移似乎很簡單。。。結束。。 */