1. 程式人生 > >藍橋杯第六屆省賽JAVA真題----壘骰子

藍橋杯第六屆省賽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個