NOIP2001提高組複賽B 數的劃分

2022-06-23 08:15:09 字數 3105 閱讀 7097

略方法為減而治之,把n劃分成k份的答案就相當於每次把n分成a,b兩個數,再把a分成k-1份,然後把每次a分成k-1份的答案相加即可。注意點是每輪分出來的b要不大於上一輪分出來的b。

1 #include 2

using

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()

view code

見**內注釋

1 #include 2

using

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

view code

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.加上數後,繼續按此規則進行處理,直到不能再加自然數為止。題目分析 看到這道題,最容易...