藍橋 壘骰子(dp+矩陣快速冪)
壘骰子
賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。
經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!
我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
假設有 m 組互斥現象,每組中的那兩個數字的面緊貼在一起,骰子就不能穩定的壘起來。
atm想計算一下有多少種不同的可能的壘骰子方式。
兩種壘骰子方式相同,當且僅當這兩種方式中對應高度的骰子的對應數字的朝向都相同。
由於方案數可能過多,請輸出模 10^9 + 7 的結果。
不要小看了 atm 的骰子數量哦~
「輸入格式」
第一行兩個整數 n m
n表示骰子數目
接下來 m 行,每行兩個整數 a b ,表示 a 和 b 數字不能緊貼在一起。
「輸出格式」
一行一個數,表示答案模 10^9 + 7 的結果。
「樣例輸入」
2 1
1 2
「樣例輸出」
544
「資料範圍」
對於 30% 的資料:n <= 5
對於 60% 的資料:n <= 100
對於 100% 的資料:0 < n <= 10^9, m <= 36
****************************************************************
- 思路:這道題可以用深搜,判斷相鄰的兩個連結面是否衝突,但是資料量太大,所以這時候應該考慮一下是否可以用動態規劃寫,可以推出dp[i][j] (代表第i層當j數字朝上的時候的個數) = dp[i-1][k] (1=<k<=6 && k與j的對面不衝突)的和。 但是這樣依然不夠 ,這樣仍然需要 6e9的複雜度。
- 所以要用構造矩陣(很難想到)構造方程如下
(fk1,fk2,fk3,fk4,fk5,fk6)*(六行六列矩陣)=(f(k+1)1,f(k+1)2,f(k+1)3,f(k+1)4,f(k+1)5,f(k+1)6);
矩陣第j列的的含義是當K+1層j朝上,第j列6個元素的意思意思是 k+1層j元素朝上的時候是否加上第K層i元素朝上的數量。
#include<cstdio> using namespace std; typedef long long ll; const ll mod=1e9+7; int opp[7]={0,4,5,6,1,2,3};//元素對對面 bool compact[7][7];//衝突標記 ll ans=0; struct Matrix{ ll m[7][7]; }; Matrix M_mul(Matrix a, Matrix b){ Matrix c; for(int i=1; i<=6; i++) { for(int j=1; j<=6; j++) { c.m[i][j]=0; for(int k=1; k<=6; k++) { c.m[i][j]=(c.m[i][j]%mod+((a.m[i][k]%mod)*(b.m[k][j])%mod)%mod)%mod; } } } return c; } Matrix M_pow(Matrix a, int t){ Matrix ans; for(int i=1; i<=6; i++) for(int j=1; j<=6; j++) if(i==j) ans.m[i][j]=1; else ans.m[i][j]=0; while(t){ if(t&1){ ans=M_mul(ans, a); } a=M_mul(a,a); t>>=1; } return ans; } int main(){ Matrix compose; int n, m; scanf("%d%d", &n, &m); for(int i=1; i<=6; i++) for(int j=1; j<=6; j++) compact[i][j]=false; for(int i=1; i<=m; i++) { int u, v; scanf("%d%d", &u, &v); compact[u][v]=true; compact[v][u]=true; } for(int i=1; i<=6; i++)//構造矩陣,如果可以為4因為可以旋轉,否則為0. { for(int j=1; j<=6; j++) { if(compact[j][opp[i]]) compose.m[j][i]=0; else compose.m[j][i]=4; } } compose=M_pow(compose, n-1); for(int i=1; i<=6; i++) { for(int k=1; k<=6; k++) { ans=(ans%mod+4*compose.m[k][i]%mod)%mod;//乘4的意思是一層的時候每一個面朝上都有四種情況。 } } printf("%lld\n", ans); return 0; }
相關推薦
藍橋 壘骰子(dp+矩陣快速冪)
壘骰子賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有 m 組互斥現象,每組中的那
【藍橋杯】- 壘骰子(確保正確的解答)
超時 include true res pan oppo == com 技術分享 百度出來的找了四篇看了下,都是錯的,除了之外,數據輸出全都不一樣。 這題乍一看是個DFS,但是數據太大了,DFS穩穩的超時,要用快速冪,我用DFS純暴力的方法試了答案,所以我敢說確保正確。 這
BZOJ4000 TJOI2015棋盤(狀壓dp+矩陣快速冪)
狀壓dp div out ons cstring char tdi getchar esp 顯然每一行棋子的某種放法是否合法只與上一行有關,狀壓起來即可。然後n稍微有點大,矩陣快速冪即可。 #include<iostream> #include<c
count (類插頭DP+矩陣快速冪)
題目大意:有n個點,編號為1~n。第i個點和第j個點之間有一條無向邊當且僅當|i-j|<=k。求這個圖的生成樹個數。k≤5,n≤1015k≤5,n≤1015。 題目分析:Coming在他初二時的資料裡找到的一道題,是我校上古大神cdc給的。我不得不吐
UVA10870—Recurrences(簡單矩陣快速冪)
src logs aps 矩陣 矩陣快速冪 分享 pow sizeof set 題目鏈接:https://vjudge.net/problem/UVA-10870 題目意思: 給出a1,a2,a3,a4,a5………………ad,然後算下面這個遞推式子,簡單的矩陣快速冪,裸題,
Chinese Rings (九連環+矩陣快速冪)
game 百度一 const problem scan make then indicate urn 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 題目: Problem Description Dumbear
ACM-ICPC 2018 焦作賽區網路預賽 L. Poor God Water(BM/矩陣快速冪)
通過本題,學到了一個非常NB的黑科技,杜教BM線性遞推模板 直接打表打出前幾項,丟入BM模板就過了,非常神奇,非常強大 網上說BM板子一般8個以上就穩了,賽後試了一下,這個題要丟入前10個數據才能AC。 #include <cstdio> #includ
Newcoder 18 F.Course(數論+矩陣快速冪)
Description A r i a
HDU 1005 Number Sequence(基礎矩陣快速冪)
//HDU 1005 15MS 1424K #include <cstdio> #include <cstring> #include <cmath> #in
【HDOJ 1005】 Number Sequence (裸矩陣快速冪)
原諒我貼個水題。。。攢了一年的'恩怨'終於瞭解了 b( ̄▽ ̄)d 去年就接觸過矩陣快速冪 線代太弱 看他們程式碼沒參悟透。。可能真是悟性太差了。。 然後一隻以為矩陣快速冪是很叼的東西(不過確實很叼) 太高深 再沒敢碰。。有毒啊………… 直到最近比賽(VJ)出現矩陣快速冪
No more tricks, Mr Nanguo HDU - 3292(pell + 矩陣快速冪)
ger img map source ring rri fff gin bsp No more tricks, Mr Nanguo Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K
hdu6030(推導+矩陣快速冪)
Happy Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
HDU 6395 Sequence(數論+矩陣快速冪)
Description 定義序列F1=A,F2=B,Fn=C⋅Fn−2+D⋅Fn−1+⌊Pn⌋F1=A,F2=B,Fn=C⋅Fn−2+D⋅Fn−1+⌊Pn⌋,求FnFn Input 第一行一整數T
POJ 3744 Scout YYF(概率DP+矩陣快速冪)
Scout YYF I Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6890 Accepted: 2004 Description YYF is a couragous scout.
Sequence(分段+矩陣快速冪)
Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 1857 Accepted Subm
第六屆藍橋杯——壘骰子(矩陣快速冪)
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #includ
壘骰子(經典遞推、矩陣快速冪)
problem 賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。 經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
壘骰子(25 point(s))(矩陣快速冪+快速冪)
壘骰子(25 point(s))賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有
壘骰子(簡單易懂版) 藍橋杯
題目描述: 賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。 經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。 假設有 m
食物(矩陣快速冪)(DP)
技術 img ring 矩陣快速冪 快速 我們 long tps ret 這個題。。我們可以想到用遞推寫!!qwq(好吧,其實我的DP水平不高啊qwq) 然後我們看到數據範圍。。。好大呀qwq線性算法肯定會T啊qwq,那。。。。寫矩陣加速吧!qwq #include<