賭聖atm晚年迷戀上了壘骰子,就是把骰子乙個壘在另乙個上邊,不能歪歪扭扭,要壘成方柱體。
經過長期觀察,atm 發現了穩定骰子的奧秘:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,骰子就不能穩定的壘起來。
atm想計算一下有多少種不同的可能的壘骰子方式。 兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數字的朝向都相同。
由於方案數可能過多,請輸出模 10^9 + 7 的結果。
輸入
存在多組測試資料,對於每組資料: 第一行兩個整數 n m(
輸出
對於每組測試資料,輸出一行,只包含乙個數,表示答案模 10^9 + 7 的結果。
這道題涉及快速冪的相關演算法,如果對於該演算法不熟悉,可以參考這篇部落格:快速冪取模
首先看資料量,快速冪的方向去求解。
然後我們來模擬一下壘骰子的過程:第乙個骰子我們可以選擇任何一面朝上,接著第二個骰子需要壘在第乙個骰子之上,假設沒有互斥的情況,那麼它有6個選擇來壘在第乙個骰子上,再考慮第三個骰子,也是6個選擇壘在第二個骰子上,接下來的所有的骰子都是一樣的。
一旦我們確定了所有的骰子在豎直方向上的組合方式後,我們還可以通過改變每個骰子的數字朝向來得到不同的組合方式,乙個骰子可以改變4個朝向,因此n個骰子的朝向總數為
因此設豎直方向上的組合方式總數為ans,則壘骰子的方案總數為。
綜上,我們只需求出豎直方向上的組合方式的遞推式,然後轉換為矩陣快速冪來求即可,改變每個骰子的數字朝向可以用快速冪取模來求解。
設得到遞推式之後,我們需要乙個矩陣t,來實現前後狀態的轉換,假設衝突面為1,2,那麼得到的衝突矩陣t及轉換公式為
由於定義的是朝上的面,因此我們應該將衝突矩陣中的衝突面的對立面的相應數字置為0,如衝突面為1,2,則只有當4朝上的時候,1才朝下,因此將4中的2置為0,意為與2衝突。
因此我們只需計算矩陣
#include #include #include #include #include #include #define ll long long
#define maxn 7
#define mod 1000000007
using namespace std;
struct matrix
}};int op[maxn];
matrix mpow(matrix m1, matrix m2)
matrix quickmod(matrix a, ll b)
return ans;
}void init()
int main()
s = quickmod(s, n-1);
long long ans = 0;
for(int i = 1; i < maxn; i++)
for(int j = 1; j < maxn; j++)
ans = (ans + s.m[i][j]) % mod;
long long tmp = 1;
long long a = 4;
while(n)
cout << (ans%mod * tmp%mod) % mod << endl;
} return 0;
}
解題報告 之 2015藍橋杯 壘骰子
賭聖 atm 晚年迷戀上了壘骰子,就是把骰子乙個壘在還有乙個上邊。不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧秘 有些數字的面貼著會互相排斥!我們先來規範一下骰子 1 的對面是 4。2 的對面是 5,3 的對面是 6。如果有 m 組相互排斥現象,每組中的那兩個數字的面緊貼在一...
藍橋杯之壘骰子
題目描述 賭聖atm晚年迷戀上了壘骰子,就是把骰子乙個壘在另乙個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧秘 有些數字的面貼著會互相排斥!我們先來規範一下骰子 1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一...
壘骰子動態規劃 藍橋杯
壘骰子 賭聖atm晚年迷戀上了壘骰子,就是把骰子乙個壘在另乙個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧秘 有些數字的面貼著會互相排斥!我們先來規範一下骰子 1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起...