1. 程式人生 > >壘骰子(經典遞推、矩陣快速冪)

壘骰子(經典遞推、矩陣快速冪)

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 Toy08成都現場 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,