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 表示,就是黑由...