壘骰子(經典遞推、矩陣快速冪)
problem
賭聖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
思路
重點是利用相對的面構造轉移矩陣, 1個數字向下的狀態有 4種。
分別儲存1朝上,2朝上…6朝上時的種數
遞推關係和相鄰限制有關,根據限制構造轉移矩陣
具體見程式碼
程式碼示例
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
const int maxn=7;
struct matrix{
ll a[maxn][maxn];
};
int Hash[7];
matrix unit()
{
matrix m;
for(int i=0;i<maxn;++i){
for(int j=0;j<maxn;++j){
if (i==j) m.a[i][j]=1;
else m.a[i][j]=0;
}
}
return m;
}
matrix matrix_mul(matrix A,matrix B)
{
matrix c;
for(int i=0;i<maxn;++i){
for(int j=0;j<maxn;++j){
c.a[i][j]=0;
for(int k=0;k<maxn;++k){
c.a[i][j]=(c.a[i][j]+(A.a[i][k]*B.a[k][j])%mod)%mod;
}
}
}
return c;
}
matrix matrix_pow(matrix A,int b)
{
matrix res=unit();
while(b)
{
if(b&1) res=matrix_mul(res,A);
A=matrix_mul(A,A);
b>>=1;
}
return res;
}
int main()
{
ios::sync_with_stdio(false);
ll n,m;
cin>>n>>m;
matrix ans,chu,fu;
//初值
memset(chu.a,0,sizeof(chu.a));
for(int i=1;i<maxn;++i) chu.a[i][1]=4;
//輔助
memset(fu.a,0,sizeof(fu.a));
for(int i=1;i<maxn;++i){
for(int j=1;j<maxn;++j){
fu.a[i][j]=4;
}
}
Hash[1]=4;
Hash[2]=5;
Hash[3]=6;
Hash[4]=1;
Hash[5]=2;
Hash[6]=3;
int a,b;
for(int i=0;i<m;++i){
cin>>a>>b;
fu.a[Hash[a]][b]=0;
fu.a[Hash[b]][a]=0;
}
ans=matrix_mul(matrix_pow(fu,n-1),chu);
ll xiang=0;
for(int i=1;i<maxn;++i){
xiang=(xiang+ans.a[i][1])%mod;
}
cout<<xiang<<endl;
return 0;
}
相關推薦
壘骰子(經典遞推、矩陣快速冪)
problem 賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。 經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。
2016 pku campusH/OpenJ_POJ - C16H(推公式+矩陣快速冪)
pow exist ref amp nbsp 多少 ica contain lines 傳送門:http://poj.openjudge.cn/practice/C16H?lang=en_US 題面:描述 Wenwen has a magical ball. Whe
常係數齊次線性遞推優化矩陣快速冪-bzoj4161-4944
常係數齊次線性遞推式 fk=∑i=1naifk−ifk=∑i=1naifk−i 形如上式的dpdp轉移式(ff表示dpdp狀態,aa表示轉移係數)即為常係數齊次線性遞推式。對於這樣的dpdp式,給定f1,2,..,k,a1,2,...,kf1,2,..,k,
2017多校聯合第二場 1006題 hdu 6050 Funny Function 遞推公式 / 矩陣快速冪
題目連結 題意: Problem Description Function Fx,ysatisfies: For given integers N and M,calculate Fm,1 modulo 1e9+7. 思路: 1. 遞推法 根據第二個式子可以
Additions (遞推公式+矩陣快速冪)
1713: Additions 時間限制: 1 Sec 記憶體限制: 128 MB 提交: 338 解決: 38 [提交][狀態][討論版] 題目描述 Ada is 5 years old, and she is learning additions. Her fa
HDU5950 Recursive sequence 非線性遞推式 矩陣快速冪
題目傳送門 題目描述:給出一個數列的第一項和第二項,計算第n項。 遞推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由於n很大,所以肯定是矩陣快速冪的題目,但是矩陣快速冪只能解決線性的問題,n^4在這個式子中是非線性的,後一項和前一項沒有什麼直接關係,所以模
hihoCoder 1143 : 骨牌覆蓋問題·一(遞推,矩陣快速冪)
時間限制:10000ms 單點時限:1000ms 記憶體限制:256MB 描述 骨牌,一種古老的玩具。今天我們要研究的是骨牌的覆蓋問題: 我們有一個2xN的長條形棋盤,然後用1x2的骨牌去覆蓋整個棋盤。對於這個棋盤,一共有多少種不同的覆蓋方法呢? 舉個例子,對
CodeChef February Challenge 2018 Broken Clock (三角函數推導 + 矩陣快速冪)
bsp clas cos and red load log https tar 題目鏈接 Broken Clock 中文題面鏈接 令$cos(xα) = f(x)$ 根據三角函數變換公式有 $f(x) = \frac{2d}{l} f(x-1) -
hdu 4549 M斐波那契數列(費馬小定理+矩陣快速冪)
F(n)=a^F(n-1)*b^F(n-2)%mod 因為a和b都與mod互素,因此用費馬小定理可以得到 F(n)=a^(f(n-1)%mod-1)*b^(f(n)%mod-1) %mod
poj(1088)——滑雪(經典遞推型動歸)
題意: 中文題,就是在所有的點中找一個點作為起點,然後叫你找出從起點開始的最長路徑是多少。 這裡高度必須嚴格遞減。 思路: 一開始我碰到這題時,沒有思路,是看題解寫的。 但是今天我回頭再去看時,發現自己能夠獨立寫出來了,而且和上次的方法不一樣。也許這就是進步吧! 其實就是一
藍橋 壘骰子(dp+矩陣快速冪)
壘骰子賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有 m 組互斥現象,每組中的那
壘骰子(簡單易懂版) 藍橋杯
題目描述: 賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。 經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。 假設有 m
第六屆藍橋杯——壘骰子(矩陣快速冪)
#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <algorithm> #includ
壘骰子(25 point(s))(矩陣快速冪+快速冪)
壘骰子(25 point(s))賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有
【藍橋杯】- 壘骰子(確保正確的解答)
超時 include true res pan oppo == com 技術分享 百度出來的找了四篇看了下,都是錯的,除了之外,數據輸出全都不一樣。 這題乍一看是個DFS,但是數據太大了,DFS穩穩的超時,要用快速冪,我用DFS純暴力的方法試了答案,所以我敢說確保正確。 這
HDU6185 Covering (遞推+矩陣快速冪)
esp over () n-1 告訴 matrix \n nbsp 答案 大致題意:讓你用1*2規格的地毯去鋪4*n規格的地面,告訴你n,問有多少種不同的方案使得地面恰好被鋪滿且地毯不重疊。答案對1000000007取模 遞推得f(n)=f(n-1)+5*f(n-2)+
HDU 5863 cjj's string game ( 16年多校10 G 題、矩陣快速冪優化線性遞推DP )
sca 組合數 矩陣 spl blank mage acm 組合 str 題目鏈接 題意 : 有種不同的字符,每種字符有無限個,要求用這k種字符構造兩個長度為n的字符串a和b,使得a串和b串的最長公共部分長度恰為m,問方案數 分析 : 直覺是DP 不過當時看到 n 很
HDU 2481 Toy(08成都現場 Polya,遞推,矩陣,數論……)
題目:外面有一圈N個結點,中心有一個結點與N個結點都相連,總共就是2*N條邊,刪除N條邊,使N+1個點連通,旋轉相同視為等價,問有多少種情況。 據說當時現場賽只有清華一個隊過了。非常綜合,其中主要是遞推部分非常難想 好題 ,難!!!!!!!!!!! 引用一句話便是:
POJ3734Blocks(遞推+矩陣快速冪)
ace pro view display \n 方塊 namespace 圖片 個數 題目鏈接:http://poj.org/problem?id=3734 題意:給出n個排成一列的方塊,用紅、藍、綠、黃四種顏色給它們染色,求染成紅、綠的方塊個數同時為偶數的方案數模1000
藍橋杯演算法提高——遞推求值(矩陣快速冪)
問題描述 已知遞推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3. 初始值為:F(1, 1)=2, F(1,