題目鏈結
時間限制:
1000 ms | 記憶體限制:
65535 kb
難度:3描述
把乙個正整數m分成n個正整數的和,有多少種分法?
例:把5分成3個正正數的和,有兩種分法:
1 1 3
1 2 2輸入
第一行是乙個整數t表示共有t組測試資料(t<=50)
每組測試資料都是兩個正整數m,n,其中(1<=n<=m<=100),分別表示要拆分的正數和拆分的正整數的個數。
輸出輸出拆分的方法的數目。
樣例輸入
25 25 3
樣例輸出
22
**[張云聰]原創
暴力應該會炸吧(聽說)。
首先 對於劃分(n,m),其結果可分為含有1和不含有1
例如對於6分解為3組 (6,3) 有 1,1,4 1,2,3 2,2,2
其中1,1,4 1,2,3為含有1的, 2,2,2為不含有1的。
這樣分有什麼用呢?
顯然如果對含有1的分法,去掉乙個1後變為 1,4 和2,3。這就變成了(5,2),也就是說 (6,3) 有一部分可以有(5,2)得來
對於不含有1的分法,我們可以同時減去1變成 1,1,1 這就變成了(3,3)
也就是說 (6,3)=(5,2)+(3,3)
那麼對於(5,2),(3,3)均可應用上面的遞推得到他的表示,直到(1,1)=1
從而得到 (n,m)=(n-1,m-1)+(n-m,m)
這樣遞推式就出來了
然後你想遞迴也好dp也好都可以了
**如下
#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
const int maxn = (int)(1e5) + 100;
const int inf = 0x3f3f3f3f;
const int mod = 2520;
const double eps = 1e-3;
typedef long long ll;
typedef unsigned long long ull;
int dp[111][111];
int main()
} int t;
scanf("%d", &t);
while (t--)
return 0;
}
NYOJ 176 整數劃分(二) (dp)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 把乙個正整數m分成n個正整數的和,有多少種分法?例 把5分成3個正正數的和,有兩種分法 1 1 3 1 2 2 輸入 第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m 100 ...
NYOJ 176 整數劃分(二)
整數劃分 二 時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述把乙個正整數m分成n個正整數的和,有多少種分法?例 把5分成3個正正數的和,有兩種分法 1 1 3 1 2 2 輸入第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m...
nyoj 176 整數劃分(二)
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述輸入 第一行是乙個整數t表示共有t組測試資料 t 50 每組測試資料都是兩個正整數m,n,其中 1 n m 100 分別表示要拆分的正數和拆分的正整數的個數。輸出輸出拆分的方法的數目。樣例輸入 2 5 25 3 樣例輸出 2 2 ...