N稜柱M染色問題

2022-09-19 15:03:06 字數 2861 閱讀 7593

p.s.1 以下預設對點染色,要求任意一對被邊直接連線的點異色

p.s.2 備選色少於4色的情況略特殊,但先對更簡單,這裡不做討論(但最後的計算程式包括了這種情況)

首先將稜柱沿著其中一條側稜剪開,並強制規定左右兩端染色情況相同,把稜柱染色轉化為線性的平面染色

接下來考慮這種「鐵軌」形狀的染色

我們可以按照鐵軌兩端的染色把其分為5類

1.\(^_ {}^_ ^_\)(用了2色,同色相對)(就是上**制要求的那種情況)

2.\(^_ {}^_ ^_\)(用了2色,異色相對)

3.\(^_ {}^_ ^_\ (also\ ^_ {}^_ ^_)\)(用了3色,同色相對)

4.\(^_ {}^_ ^_\ (also\ ^_ {}^_ ^_)\)(用了3色,異色相對)

5.\(^_ {}^_ ^_\)(用了4色)

(建議思考一下為什麼只需這5種情況就夠了)

現在考慮遞推式,也就是在最後新加入一列後的變化

令\(f_\)表示目前共 \(i\) 列的第 \(j\) 種情況 方案數

記\(s_k\)為第\(k\)種情況的簡稱

\(f_=0\ +f_\ +0\ +2(m-2)f_\ +(m-2)(m-3)f_\)

:由於染色條件限制\(^_\)不能直接跟在\(^_\ or\ ^_\)後面,\(s_1/s_3\)對\(s_1\)的貢獻是\(0\);

\(s_2\)只能直接接上\(^_\),貢獻即是它本身

\(s_4\)中的 \(c\)可以有除 \(a,b\) 外的 \(m-2\) 種顏色供選擇,同時 與\(c\)相對的是\(a\)還是\(b\) 也是不同的情況,於是前面有個係數 \(2(m-2)\)

\(s_5\)中的 \(c,d\)的顏色選擇有 \(a^_=(m-2)(m-3)\) 種,於是前面有個係數\((m-2)(m-3)\)

(這裡只分析\(s_1\)遞推式的推導,後面的留給讀者自己思考吧)

\(f_=f_\ +0\ +2(m-2)f_\ +0\ +(m-2)(m-3)f_\)

\(f_=0\ +f_\ +(m-2)f_\ +[(m-2)+(m-3)]f_\ +(m-3)^2f_\)

\(f_=f_\ +0\ +[(m-2)+(m-3)]f_\ +(m-2)f_\ +(m-3)^2f_\)

\(f_=f_\ +f_\ +2(m-3)f_\ +2(m-3)f_\ +[(m-4)^2+(m-3)]f_\)

令向量\(v_i=[f_\ ,\ f_\ ,\ f_\ ,\ f_\ ,\ f_]\)

初始\(v_1=[1,0,0,0,0]\)

設遞推矩陣\(a\)

那麼上述遞推式可寫成矩陣乘法的模式:

\[ a=\left[

\begin

0 & 1 & 0 & 1 & 1 \\

1 & 0 & 1 & 0 & 1 \\

0 & 2(m-2) & (m-2) & [(m-2)+(m-3)] & 2(m-3) \\

2(m-2) & 0 & [(m-2)+(m-3)] & (m-2) & 2(m-3) \\

(m-2)(m-3) & (m-2)(m-3) & (m-3)^2 & (m-3)^2 & [(m-4)^2+(m-3)]

\end

\right]

\]\[v_=v_i\times a\]即

\[v_i=v_1\times a^

\]最後我們要的\(n\)稜柱\(m\)染色方案數就是\(f_\),也就是\(v_n\)向量的第一維

然後我們可以求\(a\)矩陣的特徵向量和特徵值來簡化計算過程,但是解5次方程有點困難

但我們有計算機這個好幫手:)

以下是我寫的醜陋**(其中第2,3種情況倒了個位置),可計算\(n \leq 10^,m \leq 10^9\)的情況,答案對\(10^9+7\)取模

#include#include#includeusing namespace std;

#define o 1000000007

long long n;int m;

struct mt,,,,};

register int i,j;

for(i=0;i<5;i++)for(j=0;j<5;j++)

mt res;

for(i=0;i<5;i++)

return res;

} inline void operator *= (const mt& u),,,,};

register int i,j;

for(i=0;i<5;i++)for(j=0;j<5;j++)

for(i=0;i<5;i++)

}}un,e;//矩陣定義

struct vec;

register int i;

for(i=0;i<5;i++)

vec res;

res.a[0]=tmpa[0]%o;

res.a[1]=tmpa[1]%o;

res.a[2]=tmpa[2]%o;

res.a[3]=tmpa[3]%o;

res.a[4]=tmpa[4]%o;

return res;

}}ans;//向量定義

void init() };/*n=2 初始情況*/ e=(mt),,,,} };/*單位矩陣*/

un=(mt),,,

,} };//遞推矩陣

}void make3()

mt qkpw(mt ds,long long ix)return re;

}//快速冪

void solve()

return 0;

}

染色問題(n個格仔,3種顏色)

有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色 求全部的滿足要求的塗法.遞推公式 a1 3 a2 6 a 3,2 6 a3 6 a 3,3 6 an 2 a n 2 a n 1 n 4 證明 考慮第n 1個...

染色問題 n個格仔,3種顏色

有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色 求全部的滿足要求的塗法.遞推公式 a1 3 a2 6 a 3,2 6 a3 6 a 3,3 6 an 2 a n 2 a n 1 n 4 證明 考慮第n 1個...

二染色問題

乙個n n的網格,初始為白色。現在有乙個k k的印章,每次操作 你可以用印章把網格中乙個k k的子矩形染成黑色或白色。如果乙個格仔被多次染色,那麼後一次染色會覆蓋掉前一次的。現在,給你n n的由黑白兩色構成的圖案board board i j 為第i行第j列格仔的顏色,不是白字母 w 表示,就是黑由...