1. 程式人生 > >藍橋 壘骰子(dp+矩陣快速冪)

藍橋 壘骰子(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

****************************************************************

  1. 思路:這道題可以用深搜,判斷相鄰的兩個連結面是否衝突,但是資料量太大,所以這時候應該考慮一下是否可以用動態規劃寫,可以推出dp[i][j] (代表第i層當j數字朝上的時候的個數) =  dp[i-1][k] (1=<k<=6 && k與j的對面不衝突)的和。  但是這樣依然不夠 ,這樣仍然需要 6e9的複雜度。
  2. 所以要用構造矩陣(很難想到)構造方程如下

(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 WaterBM/矩陣快速

通過本題,學到了一個非常NB的黑科技,杜教BM線性遞推模板 直接打表打出前幾項,丟入BM模板就過了,非常神奇,非常強大 網上說BM板子一般8個以上就穩了,賽後試了一下,這個題要丟入前10個數據才能AC。 #include <cstdio> #includ

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 - 3292pell + 矩陣快速

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<