2022年蓝桥杯真题-积木画【最简单的矩阵快速幂】

问题描述

小明最近迷上了积木画, 有这么两种类型的积木, 分别为 I 型(大小为 2 个单位面积) 和 L 型 (大小为 3 个单位面积):
2022年蓝桥杯真题-积木画【最简单的矩阵快速幂】_第1张图片
同时, 小明有一块面积大小为 2×N 的画布, 画布由 2×N 个1×1 区域构成。小明需要用以上两种积木将画布拼满, 他想知道总共有多少种不同的方式? 积木可以任意旋转, 且画布的方向固定。

输入格式:

输入一个整数 N,表示画布大小。

输出格式:

输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007 取模后的值。

思路

2022年蓝桥杯真题-积木画【最简单的矩阵快速幂】_第2张图片
快速幂与矩阵快速幂入门

代码

import os
import sys

# 请在此输入您的代码、
mod = 10 ** 9 + 7
def multi(B, C):
  res = [[0] * 3 for _ in range(3)]
  for i in range(3):
    for j in range(3):
      for k in range(3):
        res[i][j] = (res[i][j] + B[i][k] * C[k][j] % mod) % mod
  return res
def fast_power(A, m):
  res = [[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]]
  while m > 0:
    if m % 2:
      res = multi(res, A)
    A = multi(A, A)
    m >>= 1
  return res
def main():
  n = int(input())
  f = [0, 1, 2, 5]
  if n <= 3:
    print(f[n])
    return
  mat = [[2, 1, 0],
        [0, 0, 1],
        [1, 0, 0]]
  t = fast_power(mat, n - 3)
  ans = t[0][0] * 5 + t[1][0] * 2 + t[2][0] * 1
  print(ans % mod)
main()

你可能感兴趣的:(#,快速幂与矩阵快速幂,蓝桥杯,算法刷题库,蓝桥杯,矩阵,职场和发展)