UVa 11375 Matches(遞推 高精度)

2022-09-07 20:57:12 字數 1562 閱讀 7912

思路:

1.設d[i]恰好用完i根火柴所獲得的數字種數,設c[i]是用i根火柴可以搭出的數字(單個數字0~9);則有c[8]=

2.我們首先將d[i]初始化,讓搭完乙個數字的情況先存在d[i]中,目的就是第乙個數字不搭0;則此時d=

3.我們已知搭乙個數字至少需要兩根火柴,最多需要7根,我們從i=2開始遍歷d[i],則有d[i+j]=d[i+j]+d[i]*c[j] (2<=j<=7),意思是在d[i]搭好的數字後面繼續可以新增c[j]個數字,既然字首有d[i]種,那組合起來就是d[i]*c[i]種了;

4.注意在最後輸出的時候,如果n>=6,我們要將結果+1輸出,因為有單個0的情況;

5.要使用高精度進行計算,這種規模即使是unsigned long long也遠遠不夠qaq

**:

#include

using

namespace std;

struct bigint

bigint

(int v)

while

(v);

}bigint

(const

char s)

} bigint operator+(

const bigint &b)

const

if(res.a[res.len]

>

0)res.len++

;return res;

} bigint operator*(

const bigint &b)

const

if(up)res.a[i+b.len]

=up;

} res.len=len+b.len;

while

(res.a[res.len-1]

==0&&res.len>

1)res.len--

;return res;

}void

output()

};const

int maxn=

2005

;int dat[8]

=;bigint d[maxn]

,c[8

],sum[maxn]

;void

init_()

for(

int i=

2;ifor(

int i=

1;i) sum[i]

=sum[i-1]

+d[i];}

intmain()

return0;

}

題解 UVA11375 遞推

題目鏈結 參考了大佬部落格思路摘抄如下 d i 記錄用i跟火柴可以組成多少種數字,更新式是d i c j d i c j 就是組成數字j要用的火柴數。但是不能以0開頭,最後當火柴數大於等於6的時候就可以在總答案上 1,表示可以構成乙個單獨的0 因為之前沒有0開頭的,所以要 1補回來 最後答案就是f ...

UVA11375火柴 遞推 大數

題意 給你n根火柴,問你能組成多少種數字,比如3根可以組成1或者7,組成的數字中不能有前導0,思路 我們開乙個陣列,d i 記錄用i跟火柴可以組成多少種數字,則更新狀態是這樣的 d i c j d i c j 就是組成數字j要用的火柴數,這樣跟新相當於是在模擬寫數字,但是有一點就是不能以0開頭,左後...

uva11375火柴遞推之多狀態轉移遞推

分析 把 已經使用過的火柴數i 看成狀態,可以得到乙個圖。從前往後每新增乙個數字x,就從狀態i轉移到i c x 其中c x 代表數字x需要的火柴數。當i 0的時候不允許 使用數字0 最後當n 6時,給答案單獨加上1,代表整數0 令d i 為從結點0到結點i的路徑條數,則答案f n d 1 d 2 d...