略方法為減而治之,把n劃分成k份的答案就相當於每次把n分成a,b兩個數,再把a分成k-1份,然後把每次a分成k-1份的答案相加即可。注意點是每輪分出來的b要不大於上一輪分出來的b。
1 #include 2view codeusing
namespace
std;34
#define rep(i,n) for (int i = 0; i < (n); ++i)
5#define for(i,s,t) for (int i = (s); i <= (t); ++i)
6#define rfor(i,t,s) for (int i = (t); i >= (s); --i)
7#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
8#define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)910
#define pr(x) cout << #x << " = " << x << " "
11#define prln(x) cout << #x << " = " << x << endl
1213
#define all(x) x.begin(),x.end()
14#define ins(x) inserter(x,x.begin())
1516
#define ms0(a) memset(a,0,sizeof(a))
17#define msi(a) memset(a,inf,sizeof(a))
1819
#define pii pair20
#define piii pair,int>
21#define mp make_pair
22#define pb push_back
23#define fi first
24#define se second
2526 inline int
gc()
3334 inline int
ri()
4041 typedef long
long
ll;42
const
int maxn = 1e5 + 7;43
44int
n, k;
45//
f[i][j][k]表示數i分成j分的分法總數,k為限制條件,每種分法每份的值不能超過k,用來排除重複
46//
f[i][j][k] = f[i-1][j-1][1] + f[i-2][j-1][2] + ……+ f[i-min(k, i-1)][j-1][min(k, i-1)]
47int f[201][7][202
];48
49int solve(int x, int y, int
z)59 f[x][y][z] =ret;
60return
ret;61}
6263
intmain()
見**內注釋
1 #include 2view codeusing
namespace
std;34
#define rep(i,n) for (int i = 0; i < (n); ++i)
5#define for(i,s,t) for (int i = (s); i <= (t); ++i)
6#define rfor(i,t,s) for (int i = (t); i >= (s); --i)
7#define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
8#define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)910
#define pr(x) cout << #x << " = " << x << " "
11#define prln(x) cout << #x << " = " << x << endl
1213
#define all(x) x.begin(),x.end()
14#define ins(x) inserter(x,x.begin())
1516
#define ms0(a) memset(a,0,sizeof(a))
17#define msi(a) memset(a,inf,sizeof(a))
1819
#define pii pair20
#define piii pair,int>
21#define mp make_pair
22#define pb push_back
23#define fi first
24#define se second
2526 inline int
gc()
3334 inline int
ri()
4041 typedef long
long
ll;42
const
int maxn = 1e5 + 7;43
44int
n, k;
45//
f[i][j]表示數i分成j份的分法總數
46/*
47當i < j時,很明顯沒法分,所以f[i][j] = 0;
48當i == j時,只有一種分法,所以f[i][j] = 1;
49當i > j時,考慮從小到大分,第1個如果分1,那麼f[i][j] = f[i-1][j-1];
50第1個如果分大於1的數,可以對所有j份都減一,然後再分,即 f[i][j] = f[i-j][j];
51根據加法原則,f[i][j] = f[i-1][j-1] + f[i-j][j];
52*/
53int f[201][7
]; 54
55int
main()
65
noip2001提高組題解
今天繼續感動滾粗。第一次提交170分,不能多說。第一題 一元三次方程 明明是寒假講分治的時候做過的題居然還是wa而且只拿了60分,說明知識掌握實在不夠牢固。寒假做的是保留4位小數,原題只保留2位,又因為答案在 100,100 所以直接列舉 10000到10000即可。然後鑑於寒假的時候寫的二分,我就...
統計單詞個數(NOIP 2001提高組)
題目描述 description 給出乙個長度不超過200的由小寫英文本母組成的字母串 約定 該字串以每行20個字母的方式輸入,且保證每行一定為20個 要求將此字母串分成k份 1 單詞在給出的乙個不超過6個單詞的字典中。要求輸出最大的個數。輸入描述 input description 第一行為乙個正...
NOIP 2001普及組 數的劃分
題目描述 我們要求找出具有下列性質數的個數 包含輸入的自然數n 先輸入乙個自然數n n 1000 然後對此自然數按照如下方法進行處理 1.不作任何處理 2.在它的左邊加上乙個自然數,但該自然數不能超過原數的一半 4.加上數後,繼續按此規則進行處理,直到不能再加自然數為止。題目分析 看到這道題,最容易...