Accept: 204    Submit: 627
Time Limit: 1000 mSec    Memory Limit : 65536 KB

 Problem Description

n个六边形排成一行,相邻两个六边形共用一条边,如下图所示:

记这个图形的生成树个数为t(n)(由于每条边都是不同的,不存在同构的问题)。那么t(1)=6,t(2)=35……

给出n,求mod 1000000007

 Input

第一行给出数据组数T。

之后每一行给出一个正整数n。

T大约为50000,n<=10^18。

 Output

每组数据输出一行答案。

 Sample Input

2212345678987654321

 Sample Output

41733521876

 Source

这题用矩阵快速幂做,先用dp[i][f]表示处理到第i个矩形,第i个矩形右边那条边会不会不去掉的方案数,那么dp[i][1]=d[i-1][0]+dp[i-1][1],dp[i][0]=4*dp[i-1][1]+5*dp[i-1][0].

我们可以构造矩阵【dp[i][1],dp[i][0],sum[i]  】*A=【dp[i+1][1],dp[i+1][0],sum[i+1]  】.
1 4 5
容易求出A=1 5 6
0 0 1
然后用矩阵快速幂就行了,这里要注意,这题卡常数,所以要先初始化64个矩阵的乘方,然后再算,而且注意取模不能取太多,不然会超时。
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
#define inf 0x7fffffff
#define pi acos(-1.0)
#define MOD 1000000007
struct matrix{int n,m,i;ll data[3][3];
}a,b,c,d[99],t;matrix multi(matrix &a,matrix &b){matrix ans;memset(ans.data,0,sizeof(ans.data));ans.data[0][0]=(ans.data[0][0]+a.data[0][0]*b.data[0][0]);ans.data[0][1]=(ans.data[0][1]+a.data[0][0]*b.data[0][1]);ans.data[0][2]=(ans.data[0][2]+a.data[0][0]*b.data[0][2]);ans.data[0][0]=(ans.data[0][0]+a.data[0][1]*b.data[1][0]);ans.data[0][1]=(ans.data[0][1]+a.data[0][1]*b.data[1][1]);ans.data[0][2]=(ans.data[0][2]+a.data[0][1]*b.data[1][2]);ans.data[0][0]=(ans.data[0][0]+a.data[0][2]*b.data[2][0])%MOD;ans.data[0][1]=(ans.data[0][1]+a.data[0][2]*b.data[2][1])%MOD;ans.data[0][2]=(ans.data[0][2]+a.data[0][2]*b.data[2][2])%MOD;ans.data[1][0]=(ans.data[1][0]+a.data[1][0]*b.data[0][0]);ans.data[1][1]=(ans.data[1][1]+a.data[1][0]*b.data[0][1]);ans.data[1][2]=(ans.data[1][2]+a.data[1][0]*b.data[0][2]);ans.data[1][0]=(ans.data[1][0]+a.data[1][1]*b.data[1][0]);ans.data[1][1]=(ans.data[1][1]+a.data[1][1]*b.data[1][1]);ans.data[1][2]=(ans.data[1][2]+a.data[1][1]*b.data[1][2]);ans.data[1][0]=(ans.data[1][0]+a.data[1][2]*b.data[2][0])%MOD;ans.data[1][1]=(ans.data[1][1]+a.data[1][2]*b.data[2][1])%MOD;ans.data[1][2]=(ans.data[1][2]+a.data[1][2]*b.data[2][2])%MOD;ans.data[2][0]=(ans.data[2][0]+a.data[2][0]*b.data[0][0]);ans.data[2][1]=(ans.data[2][1]+a.data[2][0]*b.data[0][1]);ans.data[2][2]=(ans.data[2][2]+a.data[2][0]*b.data[0][2]);ans.data[2][0]=(ans.data[2][0]+a.data[2][1]*b.data[1][0]);ans.data[2][1]=(ans.data[2][1]+a.data[2][1]*b.data[1][1]);ans.data[2][2]=(ans.data[2][2]+a.data[2][1]*b.data[1][2]);ans.data[2][0]=(ans.data[2][0]+a.data[2][2]*b.data[2][0])%MOD;ans.data[2][1]=(ans.data[2][1]+a.data[2][2]*b.data[2][1])%MOD;ans.data[2][2]=(ans.data[2][2]+a.data[2][2]*b.data[2][2])%MOD;return ans;/*for(int i=0;i<3;i++){for(int k=0;k<3;k++){if(a.data[i][k]>0)for(int j=0;j<3;j++){ans.data[i][j]=(ans.data[i][j]+a.data[i][k]*b.data[k][j])%MOD;}}}return ans;*/
}matrix fast_mod(ll n){matrix ans;ans.n=3;ans.m=3;memset(ans.data,0,sizeof(ans.data));ans.data[0][0]=ans.data[1][1]=ans.data[2][2]=1;int num=1;while(n>0){if(n&1){ans=multi(ans,d[num]);}num++;n>>=1;}printf("%I64d\n",(ans.data[0][2]+5*ans.data[1][2]+6*ans.data[2][2]  )%MOD);
}void init()
{int i,j;d[1].n=d[1].m=3;d[1].data[0][0]=1;d[1].data[0][1]=4;d[1].data[0][2]=5;d[1].data[1][0]=1;d[1].data[1][1]=5;d[1].data[1][2]=6;d[1].data[2][0]=0;d[1].data[2][1]=0;d[1].data[2][2]=1;for(i=2;i<64;i++){d[i]=multi(d[i-1],d[i-1]);}
}int main()
{ll n,m,i,j;int T;init();scanf("%d",&T);while(T--){scanf("%I64d",&n);if(n==0){printf("0\n");continue;}fast_mod(n-1);}return 0;
}

fzu2198 快来快来数一数相关推荐

  1. 苹果7支持快充吗_支持苹果20W+华为22.5W快充,倍思发布迷你数显快充移动电源...

    日前倍思推出了移动电源新产品线:"迷你数显快充移动电源22.5W",黑白双色可选,10000mAh.20000mAh两种容量,重量仅有180g/330g,是同级中的轻量化选手,出门 ...

  2. Fzu 2198 快来快来数一数【矩阵快速幂】

     Problem 2198 快来快来数一数 Accept: 218    Submit: 704 Time Limit: 1000 mSec    Memory Limit : 65536 KB  P ...

  3. foj2198 Problem 2198 快来快来数一数 dp 矩阵快速幂

    Problem 2198 快来快来数一数 Accept: 67 Submit: 194 Time Limit: 1000 mSec Memory Limit : 65536 KB Problem De ...

  4. 数一数你连听都没听过的古典小说有多少?

    作者:www.gudianxiaoshuo.com 数一数你连名字都没听过的古典小说有多少? 先秦 先秦汉魏晋南北朝诗 屈原全集 汉代诗歌 诗经 词 [全唐五代词] 宋词三百首 晏几道词全集 欧阳修词 ...

  5. linux查看单词个数,Linux怎么统计文本的的行数/单词数和字符数?

    Linux怎么统计文本的的行数/单词数和字符数? Linux系统中想要统计文本的行数.单词和字符数量,该怎么统计呢?我们可以使用SecureCRT来统计,下面我们就来看看详细的教程. 1.启动Linu ...

  6. 荣耀9i支持鸿蒙系统吗,让快更快荣耀Play发布 吓人技术终于来了

    中关村在线消息:下午14:30,荣耀在北京大学生体育馆召开新品发布会.会上为我们带来了荣耀Play.荣耀9i两款新机,那项"吓人的技术"终于得到了解读,那就是GPU Turbo,用 ...

  7. Java的快读快输出

    众所周知,Java Scanner类的读入的真的真的慢 在我们使用Scanner类进行读入数据时,数据一旦过万,他就会显得非常慢 而用StreamTokenizer类差不多好像是要比Scanner快个 ...

  8. 笔试中题目的时间复杂度以及快读快写介绍

       本篇主要分享下近期笔试中, 关于时间复杂度得一些经验. 1.题目格式以及快读快写    目前比较流行的题目格式大致有两种, 一种是核心代码格式(以力扣为主), 另一种是ACM格式(NOIP为主) ...

  9. Catalan数——卡特兰数

    今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来 后来查了下,原来是Catalan数.悲剧啊,现在整理一下 Catalan数--卡特兰数] 一.Catalan数的定义令h( ...

  10. 【C++快读快输详解(快速读入数字,快速输出数字)】

    众所周知,C++自带读入(废话),如 int a; cin>>a; 这个读入简单方便,但到后面,读的东西多了,读的也就显得慢些,所以有了下面的方式 int a; scanf("% ...

最新文章

  1. 监控告警满飞天,运维在家睡到自然醒...
  2. Python编程软件的安装与使用——Windows、Linux和Mac
  3. 【转】UNITY之LUA加密
  4. DVWA设置mysql_解决DVWA配置报错
  5. node-red教程2 第一条数据流
  6. 如何在六个月或更短的时间内成为DevOps工程师(一)
  7. gms签名不一致_电子签名拍照-多媒体互动装置介绍「振邦视界」
  8. python基础教程 pdf github_GitHub - looly/python-basic: 老齐(qiwsir)的Python基础教程Gitbook版...
  9. oracle 安装包_【Oracle监控】-Spotlight On Oracle安装和使用
  10. atitit.项目设计模式---ioc attilax总结
  11. CImage::Loda 方法加载图片失败,因为vs2013中该方法不支持中文变量
  12. 用数据分析验证,王者荣耀完胜阴阳师,小学生才是最终的赢家
  13. 互联网日报 | 4月26日 星期一 | 快手二次元日活跃用户突破1亿;小米全球范围内专利达1.9万件;艺龙酒店首家旗舰店在沪开业
  14. python生成指定长度的列表_python怎样创建具有一定长度和初始值的列表
  15. velocity学习(2)--VTL 语法
  16. Vue 组件事件触发另一个组件的事件
  17. 无法从[C:\My Java\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml]加载服务器配置
  18. 《Emotion Cause Detection with Linguistic Construction》
  19. 7805和78l05可以代换吗_78L05和7805的引脚有何不同??
  20. 收藏:关于色彩的心理重量

热门文章

  1. 【国家电网】2021年国家电网有限公司招聘高校毕业生公告
  2. 【Spring学习笔记】AOP
  3. Java面试题仅供自己学习
  4. 存量时代的竞争法则,从local champion做起
  5. Substance Painter材质导入unity渲染通道配置更改
  6. linux cat命令缩写,linux下cat命令详解
  7. du与df显示结果不一致
  8. 计算机语言学国外排名,美国语言学专业排名
  9. Absolute公司防盗追踪软件到底存在什么安全问题
  10. Pytest-Python单元测试