賭聖atm晚年迷戀上了壘骰子,就是把骰子乙個壘在另乙個上邊,不能歪歪扭扭,要壘成方柱體。
經過長期觀察,atm 發現了穩定骰子的奧秘:有些數字的面貼著會互相排斥!
我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,骰子就不能穩定的壘起來。
atm想計算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數字的朝向都相同。
由於方案數可能過多,請輸出模 109+7 的結果。
輸入格式
第一行包含兩個整數 n,m,分別表示骰子的數目和排斥的組數。
接下來 m 行,每行兩個整數 a,b,表示 a 和 b 數字不能緊貼在一起。
輸出格式
共乙個數,表示答案模 109+7 的結果。
資料範圍
1≤n≤109,
1≤m≤36,
1≤a,b≤6
輸入樣例:
2 11 2
輸出樣例:
544遞迴和動歸都會超時,所以需要把複雜度降到o(n)以下,正解:矩陣快速冪
思路:與其他的矩陣快速冪一樣,主要在於如何構建矩陣,
首先第一層最下面有6種朝向(1,2,3,4,5,6),每種朝向又可以偏移4次,所以arr[6]=;表示第乙個塞子的情況。遞推矩陣m[6][6];
(第乙個6表示當前骰子數字那個朝上,第二個6表示前乙個骰子那個數字朝上具體看下面的列子) f[n]=arr*m^(n-1)
舉例:測試樣例:
2 11 2
輸出:544
測試樣例2:
4 36 5
3 15 4
輸出:186880
#
include
#include
typedef
long
long ll;
ll mod=
1000000007
;int p[7]
[7];
//記錄衝突
int dd[6]
=;//記錄對立面
struct
matrix}}
};matrix fun
(matrix a,matrix b)
//兩個矩陣相乘 }}
return res;
}matrix fun1
(ll n,matrix ans)
//矩陣快速冪
return res;
}int
main()
int arr[6]
=;//表示第乙個骰子的6種不同的朝向情況
matrix k;
//衝突矩陣
for(
int i=
0;i<
6;i++)}
k=fun1
(n-1
,k);
//最後得到的衝突矩陣和arr【】相乘
ll ss=0;
for(
int i=
0;i<
6;i++)}
printf
("%lld"
,ss)
;return0;
}
藍橋杯2015省賽B組第2題
2.星系炸彈 在x星系的廣袤空間中漂浮著許多x星人造 炸彈 用來作為宇宙中的路標。每個炸彈都可以設定多少天之後 比如 阿爾法炸彈2015年1月1日放置,定時為15天,則它在2015年1月16日 有乙個貝塔炸彈,2014年11月9日放置,定時為1000天,請你計算它 的準確日期。請填寫該日期,格式為 ...
2023年藍橋杯省賽B組真題(02) 粗心的小明
小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。有一次,老師出的題目是 36 x 495 他卻給抄成了 396 x 45 但結果卻很戲劇性,他的答案竟然是對的!因為 36 495 396 45 17820 類似這樣的巧合情況可能還有很多,比如 27 594 297 54 假設 a b ...
2023年藍橋杯省賽B組C C 題目 星系炸彈
a b組題目相同 星系炸彈 在x星系的廣袤空間中漂浮著許多x星人造 炸彈 用來作為宇宙中的路標。每個炸彈都可以設定多少天之後 比如 阿爾法炸彈2015年1月1日放置,定時為15天,則它在2015年1月16日 有乙個貝塔炸彈,2014年11月9日放置,定時為1000天,請你計算它 的準確日期。請填寫該...