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 ...
随机推荐
- Java的CompletableFuture,Java的多线程开发
三.Java8的CompletableFuture,Java的多线程开发 1.CompletableFuture的常用方法 以后用到再加 runAsync() :开启异步(创建线程执行任务),无返回值 ...
- Manjaro linux 安装svn 并在文件管理器里显示相关图标
需要先安装svn linux版打开终端执行 sudo pacman -S svn 安装完成后执行一下 svn --version 出现这个就说明svn已经安装完成了,这个时候我们可以执行 svn ch ...
- Kafka 杂谈
开始之前 首先,此篇文章会有很多地方会和 RocketMQ 比较,不太熟悉 RocketMQ 可以去看看我之前写的RocketMQ基础概念剖析&源码解析,先有个大概的印象,可能会帮助你更好的理 ...
- Java中打印对象输出的字符串到底是什么?
前言 我们在进行 Java 编程时,经常要打印对象,有的是查看是否拿到了该对象,有的是查看该对象中的数据.打印输出的却是一知半解的字符串,那么这个字符串是怎么来的?代表什么?我们如何打印出对象中的数据 ...
- HttpURLConnection调用webservice,c#、java、python等HTTP调用webservice,简单的webservice调用
以前调用webservice一般使用axis.axis2先生成java类后,直接引用,多方便.但是有的webservice接口非常的函数,生成的java类非常多,有没有一种非常简化的方法. axis2 ...
- [ARM 汇编]进阶篇—异常处理与中断—2.4.2 ARM处理器的异常向量表
异常向量表简介 在ARM架构中,异常向量表是一组固定位置的内存地址,它们包含了处理器在遇到异常时需要跳转到的处理程序的入口地址.每个异常类型都有一个对应的向量地址.当异常发生时,处理器会自动跳转到对应 ...
- 从零开始整SpringBoot-搭建一个企业级项目
创建Springboot项目 在企业里的项目多数是分Modules的,更多是通过物理方式隔离层之间的职责. 首先按照原有新建SpringBoot项目创建,填好相关信息后,选择Java 8其他不用选. ...
- Maven资源大于配置问题
资源大于配置问题 <!--pom.xml中在build中配置resources,来防止我们资源导出失败的问题--> <build> <resources> < ...
- 使用LabVIEW实现 DeepLabv3+ 语义分割含源码
前言 图像分割可以分为两类:语义分割(Semantic Segmentation)和实例分割(Instance Segmentation),前面已经给大家介绍过两者的区别,并就如何在labview上实 ...
- 【Kubernetes】kubectl常用命令手册 -- 持续更新
元信息 api列表: kubectl api-resources kubectl api-resources -o wide 用法查询: kubectl explain <>.<&g ...