M×N 矩陣,K 種顏色,B 個禁色格。每格顏色不能與上方格相同。已知 N 和總方案數 R(模 100,000,007),求最小滿足條件的行數 M。
設最大禁色行為 maxX。分三段:
maxX 行:受禁色影響,逐列獨立計算方案數。maxX+1 行:消除禁色邊界影響。T = M - maxX - 1 行:每格只有 K-1 種選擇(不可與上方同色)。總方案數 ans = front * (K-1)^(T*N) ≡ R (mod MOD)。求 T 即離散對數問題 A^T ≡ B (mod MOD)。
ll log_mod(ll a, ll b) {
ll m = sqrt(mod) + 1;
unordered_map mp;
ll e = 1;
for (ll i = 0; i < m; ++i) {
if (!mp.count(e)) mp[e] = i;
e = e * a % mod;
}
ll v = inv(pow_mod(a, m));
ll cur = b;
for (ll i = 0; i < m; ++i) {
if (mp.count(cur)) return i * m + mp[cur];
cur = cur * v % mod;
}
return -1;
}
maxX 及該行禁色數 maxcnt。maxX 行方案數 ans:每列獨立,段落長度為連續非禁色格數。ans == R 直接返回 maxX。maxX+1 行方案數,若等於 R 返回 maxX+1。T,答案 maxX+1+T。BSGS O(√MOD) ≈ 10⁴,極快。整體 O(B log B + √MOD)。