Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛 矩阵快速幂)
题目描述
Every hour, God Water will eat one kind of food among meat, fish and chocolate. If there are 3 continuous hours when he eats only one kind of food, he will be unhappy. Besides, if there are 3 continuous hours when he eats all kinds of those, with chocolate at the middle hour, it will be dangerous. Moreover, if there are 3 continuous hours when he eats meat or fish at the middle hour, with chocolate at other two hours, it will also be dangerous.
Now, you are the doctor. Can you find out how many different kinds of diet that can make God Water happy and safe during N hours? Two kinds of diet are considered the same if they share the same kind of food at the same hour. The answer may be very large, so you only need to give out the answer module 1000000007.
输入
Each of the next T lines contains an integer N that shows the number of hours. (1≤N≤10^10)
输出
1 #include <bits/stdc++.h>
2
3 #define maxn 10
4 #define mod 1000000007
5 #define inf 0x3f3f3f3f
6 #define start ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
7 #define ll long long
8 #define LL long long
9 using namespace std;
10
11 struct Mat {
12 ll mat[maxn][maxn];
13
14 Mat() {
15 memset(mat, 0, sizeof(mat));
16 }
17 };
18
19 int n = 9;
20
21 Mat operator*(Mat a, Mat b) {
22 Mat c;
23 memset(c.mat, 0, sizeof(c.mat));
24 int i, j, k;
25 for (k = 1; k <= n; k++) {
26 for (i = 1; i <= n; i++) {
27 if (a.mat[i][k] == 0) continue;//优化
28 for (j = 1; j <= n; j++) {
29 if (b.mat[k][j] == 0) continue;//优化
30 c.mat[i][j] = (c.mat[i][j] + (a.mat[i][k] * b.mat[k][j]) % mod) % mod;
31 }
32 }
33 }
34 return c;
35 }
36
37 Mat operator^(Mat a, ll k) {
38 Mat c;
39 int i, j;
40 for (i = 1; i <= n; i++)
41 for (j = 1; j <= n; j++)
42 c.mat[i][j] = (i == j);
43 for (; k; k >>= 1) {
44 if (k & 1)
45 c = c * a;
46 a = a * a;
47 }
48 return c;
49 }
50
51 int main() {
52 start;
53 int T;
54 cin >> T;
55 while (T--) {
56 ll n;
57 cin >> n;
58 if (n == 1)
59 cout << 3 << endl;
60 else if (n == 2)
61 cout << 9 << endl;
62 else {
63 Mat res;
64 res.mat[1][4] = res.mat[1][7] = 1;
65 res.mat[2][1] = res.mat[2][4] = 1;
66 res.mat[3][1] = res.mat[3][7] = 1;
67 res.mat[4][5] = res.mat[4][8] = 1;
68 res.mat[5][2] = res.mat[5][8] = 1;
69 res.mat[6][2] = res.mat[6][5] = res.mat[6][8] = 1;
70 res.mat[7][6] = res.mat[7][9] = 1;
71 res.mat[8][3] = res.mat[8][6] = res.mat[8][9] = 1;
72 res.mat[9][3] = res.mat[9][6] = 1;
73 Mat cnt = res ^(n - 2);
74 ll t = 0;
75 for (int i = 1; i <= 9; ++i)
76 for (int j = 1; j <= 9; ++j)
77 t = (t + cnt.mat[j][i]) % mod;
78 cout << t << endl;
79 }
80 }
81 return 0;
82 }
Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛 矩阵快速幂)的更多相关文章
- ACM-ICPC 2018 焦作赛区网络预赛
这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...
- ACM-ICPC 2018 焦作赛区网络预赛- L:Poor God Water(BM模板/矩阵快速幂)
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- ACM-ICPC 2018 焦作赛区网络预赛 L 题 Poor God Water
God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...
- ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)
There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...
- ACM-ICPC 2018 焦作赛区网络预赛J题 Participate in E-sports
Jessie and Justin want to participate in e-sports. E-sports contain many games, but they don't know ...
- ACM-ICPC 2018 焦作赛区网络预赛 K题 Transport Ship
There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry th ...
- ACM-ICPC 2018 焦作赛区网络预赛 I题 Save the Room
Bob is a sorcerer. He lives in a cuboid room which has a length of AA, a width of BB and a height of ...
- ACM-ICPC 2018 焦作赛区网络预赛 H题 String and Times(SAM)
Now you have a string consists of uppercase letters, two integers AA and BB. We call a substring won ...
- ACM-ICPC 2018 焦作赛区网络预赛 G题 Give Candies
There are NN children in kindergarten. Miss Li bought them NN candies. To make the process more inte ...
- ACM-ICPC 2018 焦作赛区网络预赛 B题 Mathematical Curse
A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...
随机推荐
- C++面试八股文:struct、class和union有哪些区别?
某日小二参加XXX科技公司的C++工程师开发岗位5面: 面试官:struct和class有什么区别? 小二:在C++中,struct和class的唯一区别是默认的访问控制.struct默认的成员是pu ...
- R 语言绘制环状热图
作者:佳名来源:简书 - R 语言文集 1. 读取并处理基因表达数据 这是我的基因表达量数据: 图 Fig 1 > myfiles <- list.files(pattern = &quo ...
- 关于进程、线程、协程的概念以及Java中的应用
进程.线程.协程 本文将从"操作系统"."Java应用"上两个角度来探究这三者的区别. 一.进程 在我本人的疑惑中,我有以下3个问题. 1.1为什么要引入进程? ...
- 聊聊Flink必知必会(二)
Checkpoint与Barrier Flink是一个有状态的流处理框架,因此需要对状态做持久化,Flink定期保存状态数据到存储空间上,故障发生后从之前的备份中恢复,这个过程被称为Checkpoin ...
- 【webpack系列】从核心概念到上手配置
前言 作为前端开发者,相信大家或多或少都接触过webpack,现如今webpack已经渗透在了前端的各个方面,所以我们有必要来了解并学习webpack,webpack 是一种用于构建 JavaScri ...
- 简单了解一下国产GPU
英伟达都一万亿市值了,国产GPU现在发展的怎么样了?万字长文,有兴趣的进来简单了解一下. 最近,与GPU有关的几个科技新闻:一是英伟达NVIDIA市值超过一万亿美元,成为全球第一家市值过万亿的芯片公司 ...
- PHP检查更新加载本地版本号并解压覆盖
<?phperror_reporting(0);ob_implicit_flush(true);$begin = microtime(true);//检查更新,加载本地版本号$config = ...
- 在映客的虚拟KTV里唱了一首“爱你”
如果你突然打了个喷嚏 那一定就是我在想你 如果半夜被手机吵醒 啊~那是你的虚拟 KTV 在响起 2022 年 5 月 18 日,映客 App 上线了业内首个元宇宙 K 歌玩法「全景 K 歌」,给用 ...
- JavaScript进阶指南: DOM与BOM操作,从初学者到专家,一步也能登天一篇文章就足够了
DOM与BOM操作 复习链接: http://c.biancheng.net/view/9360.html 事件对象: https://www.runoob.com/jsref/dom-obj-eve ...
- CS144 LAB5~LAB6
CS144 lab5~6 最后两个lab了,虽然很多大佬都说剩下的两个lab比起TCP的实现,"简直太简单了",但是我认为做这两个之前需要补充一些额外的网络知识,不然直接上手去做的 ...