藍橋杯第六屆省賽JAVA真題----壘骰子
賭聖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
資源約定:
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 2000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:“請您輸入...” 的多餘內容。
所有程式碼放在同一個原始檔中,除錯通過後,拷貝提交該原始碼。
注意:不要使用package語句。不要使用jdk1.7及以上版本的特性。
注意:主類的名字必須是:Main,否則按無效程式碼處理。
解析:首先分析一下樣例輸出中544怎麼來的,我們看到題意中說明了不同的朝向是不同的結果,那麼對於兩個骰子來說,最終結果就需要再乘上4^n,而樣例中就是4^2,544-4^2=34,這34是怎麼來的,下面代表骰子接觸的兩個面的情況,5+5+6+6+6+6=34。
下面的程式碼用到了矩陣快速冪
import java.util.Scanner; public class Main { static final double MOD = 10e9-7; static int[][] arr = new int[6][6]; public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int m = input.nextInt(); /** * 初始化arr陣列 * */ for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { arr[i][j] = 1; } } for (int i = 0; i < m; i++) { int a = input.nextInt(); int b = input.nextInt(); arr[a-1][b-1] = 0; arr[b-1][a-1] = 0; } int[][] ans = pow(arr, n-1); int sum = 0; for (int i = 0; i < 6; i++) { for (int j = 0; j < 6; j++) { sum += ans[i][j]%MOD; } } /** * 旋轉情況 4^n * */ sum *= Math.pow(4, n)%MOD; System.out.println((int)(sum%MOD)); } private static int[][] pow(int[][] arr, int k) { /** * 初始化單位矩陣 * */ int[][] ans = new int[6][6]; for (int i = 0; i < 6; i++) { ans[i][i] = 1; } /** * 矩陣快速冪核心演算法 * */ while (k != 0) { if (k % 2 != 0) { ans = Multiply(arr, ans); } else { arr = Multiply(arr, arr); } k >>= 1; } return ans; } private static int[][] Multiply(int[][] m, int[][] n) { // 標準計算矩陣乘法演算法 int rows = m.length; int cols = n[0].length; int[][] r = new int[rows][cols]; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { for (int k = 0; k < m[i].length; k++) { r[i][j] += (m[i][k] * n[k][j])%MOD; } } } return r; } }
相關推薦
藍橋杯第六屆省賽JAVA真題----壘骰子
壘骰子賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥!我們先來規範一下骰子:1 的對面是 4,2 的對面是 5,3 的對面是 6。假設有 m 組互斥現象,每組中的那
藍橋杯第六屆省賽JAVA真題----生命之樹
生命之樹 在X森林裡,上帝建立了生命之樹。 他給每棵樹的每個節點(葉子也稱為一個節點)上,都標了一個整數,代表這個點的和諧值。 上帝要在這棵樹內選出一個非空節點集S,使得對於S中的任意兩個點a,b,都存在一個點列 {a, v1, v2, …, vk, b} 使得
藍橋杯第八屆省賽JAVA真題----日期問題
標題:日期問題小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有采用年/月/日的,有采用月/日/年的,還有采用日/月/年的。更加麻煩的是,年份也都省略了前兩位
藍橋杯第八屆省賽JAVA真題----拉馬車
標題:拉馬車小的時候,你玩過紙牌遊戲嗎?有一種叫做“拉馬車”的遊戲,規則很簡單,卻很吸引小朋友。其規則簡述如下:假設參加遊戲的小朋友是A和B,遊戲開始的時候,他們得到的隨機的紙牌序列如下:A方:[K, 8, X, K, A, 2, A, 9, 5, A]B方:[2, 7, K
藍橋杯第八屆省賽JAVA真題----字母組串
標題:字母組串 由 A,B,C 這3個字母就可以組成許多串。 比如:”A”,”AB”,”ABC”,”ABA”,”AACBB” …. 現在,小明正在思考一個問題: 如果每個字母的個數有限定,能組成多少個已知長度的串呢? 他請好朋友來幫忙,很快得到了程式碼
藍橋杯-第七屆省賽javaA組-搭積木
搭積木 小明最近喜歡搭數字積木, 一共有10塊積木,每個積木上有一個數字,0~9。 搭積木規則: 每個積木放到其它兩個積木的上面,並且一定比下面的兩個積木數字小。 最後搭成4層的金字塔形,必須用完所有的積木。 下面是兩種合格的搭法: 0 1 2 3 4 5 6 7 8 9 0 3
藍橋杯 第七屆省賽試題 四平方和
四平方和定理,又稱為拉格朗日定理: 每個正整數都可以表示為至多4個正整數的平方和。 如果把0包括進去,就正好可以表示為4個數的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7
藍橋杯 第七屆省賽試題 生日蠟燭
生日蠟燭 某君從某年開始每年都舉辦一次生日party,並且每次都要吹熄與年齡相同根數的蠟燭。 現在算起來,他一共吹熄了236根蠟燭。 請問,他從多少歲開始過生日party的? 請填寫他開始過生日party的年齡數。 注意:你提交的應該是一個整數,不要填寫任何多餘的內容或說明性文字。
藍橋杯-第七屆省賽javaC組- 骰子游戲
骰子游戲 我們來玩一個遊戲。 同時擲出3個普通骰子(6個面上的數字分別是1~6)。 如果其中一個骰子上的數字等於另外兩個的和,你就贏了。 下面的程式計算出你能獲勝的精確概率(以既約分數表示) public class Main { public static int gcd
藍橋杯-第七屆省賽javaA組-抽籤
抽籤 X星球要派出一個5人組成的觀察團前往W星。 其中: A國最多可以派出4人。 B國最多可以派出2人。 C國最多可以派出2人。 .... 那麼最終派往W星的觀察團會有多少種國別的不同組合呢? 下面的程式解決了這個問題。 陣列a[] 中既是每個國家可以派出的最多的名額。
藍橋杯 第七屆省賽試題 壓縮變換
壓縮變換 小明最近在研究壓縮演算法。 他知道,壓縮的時候如果能夠使得數值很小,就能通過熵編碼得到較高的壓縮比。 然而,要使數值很小是一個挑戰。 最近,小明需要壓縮一些正整數的序列,這些序列的特點是,後面出現的數字很大可能是剛出現過不久的數字。對於這種特殊的序列,小明準備對序
藍橋杯 第七屆省賽試題 抽籤
抽籤 X星球要派出一個5人組成的觀察團前往W星。 其中: A國最多可以派出4人。 B國最多可以派出2人。 C國最多可以派出2人。 .... 那麼最終派往W星的觀察團會有多少種國別的不同組合呢? 下面的
藍橋杯 第七屆省賽試題 煤球數目
煤球數目 有一堆煤球,堆成三角稜錐形。具體: 第一層放1個, 第二層3個(排列成三角形), 第三層6個(排列成三角形), 第四層10個(排列成三角形), .... 如果一共有100層,共有多少個煤球?
第六屆藍橋杯【省賽試題9】壘骰子 ( 矩陣快速冪 )
題目描述: 賭聖atm晚年迷戀上了壘骰子,就是把骰子一個壘在另一個上邊,不能歪歪扭扭,要壘成方柱體。 經過長期觀察,atm 發現了穩定骰子的奧祕:有些數字的面貼著會互相排斥! 我們先來規範一下骰子:
藍橋杯第六屆-牌型總數&&藍橋杯第七屆-湊算式&&藍橋杯第七屆-方格填數
amp abs 絕對值 return tin ace con name 可能性 牌型總數 去掉大小王之後就相當於4套1到13的數字牌的集合(因為忽略花色了),所以1到13各有4張;枚舉思路就是考慮13種數字牌在自己手中到底有幾張,共有五種可能性,也就是某種數字牌在手中可
藍橋杯第六屆 格子中輸出(printf()的*修飾符)
#include <stdio.h> #include <string.h> void StringInGrid(int width, int height, const c
藍橋杯第六屆 第10題 生命之樹
在X森林裡,上帝建立了生命之樹。 他給每棵樹的每個節點(葉子也稱為一個節點)上,都標了一個整數,代表這個點的和諧值。 上帝要在這棵樹內選出一個非空節點集S,使得對於S中的任意兩個點a,b,都存在一個
2015第六屆藍橋杯全國軟體大賽省賽(預賽)總結
這是我上大學以來第一次自發的寫總結,這也許意味著我對大學的看法和接下來的大學生活都將有所改變吧。首先說說引導我寫這篇總結的“人物”吧,RUI,從大一開始便是同學,直到大三成為了舍友。他的成績一直很好,如果沒記錯的話,大一專業第一名,大二好像也是第一第二的,總之在班裡一直名列
【藍橋杯】第六屆國賽C語言B組 2.完美正方形(dfs)
spa else img IT bool break main LG fill 如果一些邊長互不相同的正方形,可以恰好拼出一個更大的正方形,則稱其為完美正方形。 歷史上,人們花了很久才找到了若幹完美正方形。比如:如下邊長的22個正方形2 3 4 6 7 8 12 13 14
【藍橋杯】第六屆國賽C語言B組 1.積分之迷(水題)
水題 urn class %d names 風鈴 需要 藍橋 std 小明開了個網上商店,賣風鈴。共有3個品牌:A,B,C。為了促銷,每件商品都會返固定的積分。 小明開業第一天收到了三筆訂單:第一筆:3個A + 7個B + 1個C,共返積分:315第二筆:4個A + 10個