藍橋杯2015初賽 壘骰子

2021-10-20 10:07:27 字數 1856 閱讀 2804

賭聖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 組互斥現象,每組中的那兩個數字的面緊貼在一起...