Poor God Water
时间限制: 1 Sec 内存限制: 128 MB
提交: 102 解决: 50
[提交] [状态] [命题人:admin]
题目描述
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.

样例输入
复制样例数据
3
3
4
15
样例输出
20
46
435170

题目大意:
假设鱼为aaa,肉为bbb,巧克力为ccc,先输入一个数字TTT,表示共有TTT组测试数据,下面TTT行每行输入一个整数nnn,代表有nnn个时刻,每个时刻可以吃一种食物,但不能连续三个小时吃同一种食物,即aaaaaaaaa,bbbbbbbbb,ccccccccc不合法,当在三个小时内三种食物都吃的话,巧克力不能放中间,即acbacbacb,bcabcabca不合法,还有就是caccaccac,bcbbcbbcb,问共有多少种吃法。

解题思路:
当n=1n=1n=1时,有f[1]=3f[1]=3f[1]=3种吃法,即a,b,ca,b,ca,b,c
当n=2n=2n=2时,有f[2]=9f[2]=9f[2]=9种吃法,并假设
1、aa2、ba3、ca1、aa\ \ \ \ \ 2、ba\ \ \ \ \ 3、ca1、aa     2、ba     3、ca
4、ab5、bb6、cb4、ab\ \ \ \ \ 5、bb\ \ \ \ \ 6、cb4、ab     5、bb     6、cb
7、ac8、bc9、cc7、ac\ \ \ \ \ 8、bc\ \ \ \ \ 9、cc7、ac     8、bc     9、cc
当n=3n=3n=3时,有f[3]=20f[3]=20f[3]=20种吃法
1、aa{bc2、ba{abc3、ca{ab1、aa\begin{cases}b \\c \end{cases}\ \ \ \ \ 2、ba\begin{cases}a\\b \\c \end{cases}\ \ \ \ \ 3、ca\begin{cases}a \\b \end{cases}1、aa{bc​     2、ba⎩⎪⎨⎪⎧​abc​     3、ca{ab​
4、ab{abc5、bb{ac6、cb{ab4、ab\begin{cases}a\\b \\c \end{cases}\ \ \ \ \ 5、bb\begin{cases}a \\c \end{cases}\ \ \ \ \ 6、cb\begin{cases}a \\b \end{cases}4、ab⎩⎪⎨⎪⎧​abc​     5、bb{ac​     6、cb{ab​
7、ac{ac8、bc{bc9、cc{ab7、ac\begin{cases}a \\c \end{cases}\ \ \ \ \ 8、bc\begin{cases}b \\c \end{cases}\ \ \ \ \ 9、cc\begin{cases}a \\b \end{cases}7、ac{ac​     8、bc{bc​     9、cc{ab​
当n>=3n>=3n>=3时
其情况111的个数有:f[n−1].2+f[n−1].3f[n-1].2+f[n-1].3f[n−1].2+f[n−1].3
其情况222的个数有:f[n−1].4+f[n−1].5+f[n−1].6f[n-1].4+f[n-1].5+f[n-1].6f[n−1].4+f[n−1].5+f[n−1].6
其情况333的个数有:f[n−1].7+f[n−1].9f[n-1].7+f[n-1].9f[n−1].7+f[n−1].9
其情况444的个数有:f[n−1].1+f[n−1].2+f[n−1].3f[n-1].1+f[n-1].2+f[n-1].3f[n−1].1+f[n−1].2+f[n−1].3
其情况555的个数有:f[n−1].4+f[n−1].6f[n-1].4+f[n-1].6f[n−1].4+f[n−1].6
其情况666的个数有:f[n−1].8+f[n−1].9f[n-1].8+f[n-1].9f[n−1].8+f[n−1].9
其情况777的个数有:f[n−1].1+f[n−1].2f[n-1].1+f[n-1].2f[n−1].1+f[n−1].2
其情况888的个数有:f[n−1].4+f[n−1].5f[n-1].4+f[n-1].5f[n−1].4+f[n−1].5
其情况999的个数有:f[n−1].7+f[n−1].8f[n-1].7+f[n-1].8f[n−1].7+f[n−1].8
所以可得:
∣f[n].1f[n].2f[n].3f[n].4f[n].5f[n].6f[n].7f[n].8f[n].9000000000000000000000000000000000000000000000000000000000000000000000000∣=∣111111111000000000000000000000000000000000000000000000000000000000000000000000000∣×∣000100100100100100100100000010010010010000010010010000001000001000001001001001000∣n−2\begin{vmatrix} f[n].1 & f[n].2& f[n].3 & f[n].4 & f[n].5 & f[n].6 & f[n].7 & f[n].8 & f[n].9 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ \end{vmatrix}=\begin{vmatrix} 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ \end{vmatrix}\times\begin{vmatrix} 0 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 & 0 & 1 & 0 & 0 & 0 \\ \end{vmatrix}^{n-2}∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣​f[n].100000000​f[n].200000000​f[n].300000000​f[n].400000000​f[n].500000000​f[n].600000000​f[n].700000000​f[n].800000000​f[n].900000000​∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣​=∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣​100000000​100000000​100000000​100000000​100000000​100000000​100000000​100000000​100000000​∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣​×∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣​011000000​000111000​000000101​111000000​000101000​000000011​110000000​000110000​000000110​∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣∣​n−2
因此直接用矩阵快速幂计算即可

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <bitset>
#include <set>
#include <utility>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
struct node
{ll arr[9][9];node() {ms(arr);}
};
node mul(node a,node b) {node c;for(int i=0;i<9;i++) {for(int j=0;j<9;j++) {for(int k=0;k<9;k++) {c.arr[i][j]=(c.arr[i][j]+(a.arr[i][k]*b.arr[k][j])%mod+mod)%mod;}}}return c;
}
ll quickpow(ll n) {node base;base.arr[1][0]=1;base.arr[2][0]=1;base.arr[3][1]=1;base.arr[4][1]=1;base.arr[5][1]=1;base.arr[6][2]=1;base.arr[8][2]=1;base.arr[0][3]=1;base.arr[1][3]=1;base.arr[2][3]=1;base.arr[3][4]=1;base.arr[5][4]=1;base.arr[7][5]=1;base.arr[8][5]=1;base.arr[0][6]=1;base.arr[1][6]=1;base.arr[3][7]=1;base.arr[4][7]=1;base.arr[6][8]=1;base.arr[7][8]=1;node a;a.arr[0][0]=1;a.arr[0][1]=1;a.arr[0][2]=1;a.arr[0][3]=1;a.arr[0][4]=1;a.arr[0][5]=1;a.arr[0][6]=1;a.arr[0][7]=1;a.arr[0][8]=1;while(n) {if(n&1) a=mul(a,base);base=mul(base,base);n>>=1;}ll ans=0;for(int i=0;i<9;i++) {ans=(ans+a.arr[0][i])%mod;}return ans;
}
int main()
{#ifndef ONLINE_JUDGE//freopen("in.txt", "r", stdin);#endif//freopen("out.txt", "w", stdout);//ios::sync_with_stdio(0),cin.tie(0);int T;scanf("%d",&T);while(T--) {ll n;scanf("%lld",&n);if(n==1) printf("3\n");else printf("%lld\n",quickpow(n-2));}return 0;
}

Poor God Water【矩阵快速幂】相关推荐

  1. 【ZOJ 2974】Just Pour the Water(矩阵快速幂)

    传送门:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2974 题意 给出n个杯子与初始水量同时进行操作 将其中的水同时平均 ...

  2. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)

    描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells hi ...

  3. DUToj1085 Water Problem(矩阵快速幂)

    Problem I: Water Problem Time Limit:3000/1000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java ...

  4. ZOJ2974 Just Pour the Water(5th 浙江省赛)矩阵快速幂

    问题链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2974 问题描述: Just Pour the Water Tim ...

  5. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  6. 【做题】SRM701 Div1 Hard - FibonacciStringSum——数学和式&矩阵快速幂

    原文链接 https://www.cnblogs.com/cly-none/p/SRM701Div1C.html 题意:定义"Fibonacci string"为没有连续1的01串 ...

  7. 快速幂 + 矩阵快速幂

    快速幂 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #define LL lo ...

  8. HDU4549(矩阵快速幂+快速幂)

    f(n)=a^f(n-1) + b^f(n-2):计算矩阵部分用矩阵快速幂:计算a的幂次和b的幂次用快速幂. #include<iostream> #include<algorith ...

  9. [HNOI2008]GT考试[矩阵快速幂+kmp优化的dp]

    解题思路:假如说我们用f[i]表示长度为i的串能组合成无不吉利数字的组合的个数的话我们无法找到f[i]和f[i+1]的关系,就是我们下一位填某个数字会不会出现不吉利串,这就和你前面的串末尾于不吉利串重 ...

最新文章

  1. 宏基因组合种华山松、云杉专车3天领证
  2. 独家 | 数据科学入门指南:新手如何步入数据科学领域?
  3. 图的邻接矩阵简单实现Win32版本
  4. sql如何遍历几百万的表_Oracle PL/SQL调优技巧分享
  5. 50行的python游戏代码_50行代码实现贪吃蛇(具体思路及代码)
  6. 这个回答让我错失offer!成功收获美团,小米安卓offer
  7. 零基础带你学习MySQL—数学函数(十四)
  8. Linux下强制某登录用户下线
  9. C语言程序设计 第八章字符串
  10. 怎样学好计算机——计算机达人成长之路(23)
  11. nodejs 项目目录结构设计
  12. Problem D: 字符构成的图形
  13. java水泡_FrozenBubble java实现的泡泡龙游戏,完整 逻辑,关卡功能,分数记录。 Games 240万源代码下载- www.pudn.com...
  14. 《公主连结》交互设计师:如何用TV画手法制作2D技能动画
  15. 《简洁记账》产品浅析
  16. 没有免费用户却飞速发展,Uber技术栈全解析!
  17. Tensorflow 2.* 网络训练(二) fit(x, y, batch_size, epochs, verbose, validation_split, initial_epoch... )
  18. win10计算机组共享的打印机,Win10系统局域网共享打印机设置 共享大地Win10打印机的方法...
  19. emby ios 收费_点播、直播一条龙,使用Jellyfin打造最强媒体中心(篇一)
  20. TCP协议中的Ack和Seq号

热门文章

  1. C语言 ##__VA_ARGS__ - C语言零基础入门教程
  2. 彩色BMP转换成灰度图的原理
  3. oracle怎么以时间排序,oracle指定数据排序在前面怎么处理
  4. linux查看发起ddos攻击的ip,在Linux上使用netstat命令查证DDOS攻击的方法
  5. python 画线条进行到指定区域更改颜色,使用Colormaps在matplotlib中设置线条的颜色...
  6. tableau三轴合并_举个栗子!Tableau技巧(34):同一张图表如何呈现多个度量
  7. linux 改目录前缀,Linux修改终端显示前缀及环境变量
  8. android car bt模块,大谷蓝牙小车BT Car/Android Car手机控制 重力控制小车 安卓操控小车...
  9. win7无法连接打印机拒绝访问_“Windows无法连接打印机,操作失败,错误为0x000003e3”...
  10. 福建省高等学校非计算机考试大纲,福建省高等学校计算机应用水平等级考试三级(偏软)考试大纲...