题目描述

God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him that some sequence of eating will make them poisonous.
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.

输入

The fist line puts an integer T that shows the number of test cases. (T≤1000)
Each of the next T lines contains an integer N that shows the number of hours. (1≤N≤10^10)

输出

For each test case, output a single line containing the answer.
 
题意:有肉,鱼,巧克力三种食物,有几种禁忌,对于连续的三个食物,1.这三个食物不能都相同;2.若三种食物都有的情况,巧克力不能在中间;3.如果两边是巧克力,中间不能是肉或鱼,求方案数。
分析:设巧克力是1,肉是2,鱼是3。则对于n个小时来说,n-2和n-1的食物可以推出n-1和n的食物,设i=(k-1)*3+j,其中k是第n-2小时吃的食物编号,j是第n-1小时吃的食物编号,例如第n-2小时吃了肉,第n-1小时吃了鱼,则a6是这种方案的种数。通过枚举可算出递推:a1=a4+a7;a2=a1+a4;a3=a1+a7;a4=a5+a8;a5=a2+a8;a6=a2+a5+a8;a7=a6+a9;a8=a3+a6+a9;a9=a3+a6。(左式为第n-1小时和n小时吃某两类事物的方案数,右式为第n-2小时和第n-1小时吃某两类食物的方案数)。则答案为一个9*1的全为1的矩阵(代表a1~a9)与一个9*9的矩阵的n-2(n>=3)次幂相乘(若ai=aj+ak,则res[i][j]和res[i][k]都为1)。

 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 焦作赛区网络预赛 矩阵快速幂)的更多相关文章

  1. ACM-ICPC 2018 焦作赛区网络预赛

    这场打得还是比较爽的,但是队友差一点就再过一题,还是难受啊. 每天都有新的难过 A. Magic Mirror Jessie has a magic mirror. Every morning she ...

  2. 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 ...

  3. 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 ...

  4. ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)

    There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...

  5. 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 ...

  6. 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 ...

  7. 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 ...

  8. 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 ...

  9. ACM-ICPC 2018 焦作赛区网络预赛 G题 Give Candies

    There are NN children in kindergarten. Miss Li bought them NN candies. To make the process more inte ...

  10. ACM-ICPC 2018 焦作赛区网络预赛 B题 Mathematical Curse

    A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...

随机推荐

  1. 【Java】Eclipse常用快捷键整理

    前言 还是最近在上Java课,由于疫情原因,看的网课,那里的老师比较实战派,很多时候不知道按了什么快捷键就立马出现了很骚的操作.网上查询后发现了一些快捷键对于我这个eclipse小白还是挺常用的,整理 ...

  2. javascript中的错误类型

    javascript 中的错误类型: SyntaxError TypeError ReferenceError RangeError URLError Error SyntaxError 语法错误 / ...

  3. IT入门深似海,入门到放弃你学废了嘛

    我一直觉得IT行业 程序员行业.甚至觉得程序员人群 是一个特殊存在的群体. 入门到放弃,是真的,IT门槛高嘛. 其实吧,IT编程门槛,是有的,但是对于感兴趣的,想学习IT编程同学来说,也是一件容易事情 ...

  4. Go 语言 map 是并发安全的吗?

    原文链接: Go 语言 map 是并发安全的吗? Go 语言中的 map 是一个非常常用的数据结构,它允许我们快速地存储和检索键值对.然而,在并发场景下使用 map 时,还是有一些问题需要注意的. 本 ...

  5. Tomcat处理http请求之源码分析

    本文将从请求获取与包装处理.请求传递给Container.Container处理请求流程,这3部分来讲述一次http穿梭之旅. 1 请求包装处理 tomcat组件Connector在启动的时候会监听端 ...

  6. Redis系列13:分布式锁实现

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...

  7. Simple CTF

    来自tryhackme的Simple CTF IP:10.10.27.234 信息收集 端口扫描 nmap -sV -T4 10.10.27.234 可以看到三个端口 21/tcp 打开 ftp vs ...

  8. 【GIS】图层中多个面要素融合成一个面要素

            对于那些利用GIS信息进行编辑,设计的GIS专业人士来说,桌面GIS占有主导地位.GIS专业人士使用标准桌面作为工具来设计,共享,管理和发布地理信息. ArcGIS Desktop是一 ...

  9. 「学习笔记」DP 学习笔记1

    序列 DP 一般序列 DP 核心思想:将序列的前 \(i\) 个数的状态用一个更简单的形式表示出,并且体现出这些状态对后续的影响. 题目 ABC 267D 给定一个序列 \(a\),找到一个长度为 \ ...

  10. 宋红康-Java基础复习笔记详细版

    Java基础复习笔记 第01章:Java语言概述 1. Java基础学习的章节划分 第1阶段:Java基本语法 Java语言概述.Java的变量与进制.运算符.流程控制语句(条件判断.循环结构).br ...