color 圓盤染色

2022-05-01 23:27:10 字數 1023 閱讀 7958

題目大意:給你乙個圓盤,等分成n個扇形,有m種顏色,每兩個相鄰的扇形不能顏色不能相同,求染色方案數。

注釋:m,n<=$10^6$.

想法:這題是小圓盤染色的加強版(小圓盤染色?),想法和那道題類似,只不過是乙個更一般的形式。同樣的想法,我們採用一種分劃(分劃?猛戳看黃字)。給定乙個起始扇形。顯然,這道題我們的疑惑就在於最後乙個扇形與起始扇形的顏色是否相同。所以,我們期望考慮倒數第二個扇形的顏色。倒數第二個扇形的顏色無非就是兩種:1.和起始扇形顏色相同。2.和起始扇形顏色不同。這兩種顯然就是本題的一種分劃。那麼,我們分別考慮:我們記錄 a [i] 表示有i個扇形時的染色方案數。

如果倒數第二個扇形與起始扇形顏色相同,我們就暫時將起始扇形、倒數第乙個扇形和倒數第二個扇形看成乙個扇形(因為這個大扇形的左右兩個小扇形的顏色是相同的,剩下i-3個扇形對倒數第1個扇形沒有影響),此時的方案數為a[i-2],又因為倒數第乙個扇形被兩個相同顏色的扇形夾住了,所以此時有(m-1)*a[i-2]種方案。

另一種情況:此時倒數第2個扇形與起始扇形顏色不相同。那麼此時,即使將倒數第乙個扇形去掉,剩下的扇形也是滿足題意的,而且此時倒數第乙個扇形有(m-2)種染色方法,所以此時有(m-2)*a[i-1],種染色方法。

綜上,我們可以得出:$a_i=(m-1)\cdot a_+(m-2)\cdot a_$.

下面,附上醜陋的**......

#include #include #define mod 20102010

using namespace std;

long long a[1000100];

int main()

printf("%lld\n",a[n]);

return 0;

}

小結:錯誤

1.千萬要搞清楚n,m的輸入順序。

2.由於n,m的資料範圍,兩數相乘是容易爆int,所以,開long long;

圓盤染色 大資料

將乙個圓盤分為n個扇形,每個扇形可塗紅 黃 藍三種顏色中的一種,但相鄰兩個扇形的顏色必須不同,問有多少中塗法。第一行乙個數t表示t組資料,接下來t行每行乙個數n表示分成n個扇形。對於組資料輸出乙個數表示染色的方案數,結果模12345678。21236 資料範圍 30 的資料t 10,n 100。10...

JDOJ3008 圓盤染色

jdoj3008 圓盤染色 將乙個圓盤分為n 1 n 105 個扇形,每個扇形可塗紅r 黃g 藍b三種顏色中的一種,但相鄰兩個扇形的顏色必須不同,問有多少種塗法。輸入乙個整數n,表示將圓盤分為多少個扇區。輸出乙個整數,表示n個扇區染成rgb,相鄰扇區顏色不同的方案數,答案可能會很大,結果模上2333...

7 1 移動圓盤

給出n個圓盤的半徑,現在要把這些圓盤依次放在柱子上,當準備把第i個半徑為ai的圓盤放置到柱子上時,如果柱子頂部的圓盤半徑小於ai,那麼將柱子頂部的圓盤拿出,如果頂部的盤子半徑仍然小於ai,那麼繼續拿出,直到頂部圓盤半徑大於或等於ai為止,此時才把第i個盤子放到柱子上。那麼,最後從下往上輸出柱子上的圓...