fzu2198 快来快来数一数
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
Sample Output
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].
#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 快来快来数一数的更多相关文章
- fzu Problem 2198 快来快来数一数 (快速幂+优化)
题目链接: Problem 2198 快来快来数一数 题目描述: 给出n个六边形排成一排,a[i]代表i个六边形能组成的生成树个数,设定s[i]等于a[1]+a[2]+a[3]+....+a[i- ...
- OpenGL快问快答
OpenGL快问快答 本文内容主要来自对(http://www.opengl.org/wiki/FAQ)的翻译,随机加入了本人的观点.与原文相比,章节未必完整,含义未必雷同,顺序未必一致.仅供参考. ...
- 快读&快写模板【附O2优化】
快读&快写模板 快读快写,顾名思义,就是提升输入和输出的速度.在这里简单介绍一下几种输入输出的优劣. C++ cin/cout 输入输出:优点是读入的时候不用管数据类型,也就是说不用背scan ...
- P1908 逆序对——树状数组&离散化&快读快写の学习
题目简述: 对于给定的一段正整数序列,逆序对就是序列中 a_i>a_jai>aj 且 i<ji<j 的有序对. 输出序列中逆序对的数目. 知识补充: 树状数组: 这东西就是 ...
- HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)
HDU 1068 :题目链接 题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识. 转换一下:就是大家都不认识的人,即最大独立集合 #include <iostream ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- HDU 4160 Dolls (最小路径覆盖=顶点数-最大匹配数)
Dolls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- catalan 数——卡特兰数(转)
Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...
- html5 vedio 播放器,禁掉进度条快进快退事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS 实现计算一段文字中的字节数,字母数,数字数,行数,汉字数。
看到了匹配,第一个想到了用正则表达式,哈哈,果然很方便.不过正则表达式高深莫测!我还没有研究明白啊..目前学了点皮毛.代码如下: <!DOCTYPE html PUBLIC "-//W ...
随机推荐
- LeetCode682 棒球比赛
题目描述: 你现在是棒球比赛记录员.给定一个字符串列表,每个字符串可以是以下四种类型之一:1.整数(一轮的得分):直接表示您在本轮中获得的积分数.2. "+"(一轮的得分):表示本 ...
- Windows Server 2012 R2远程桌面默认端口修改
修改3389默认端口可使服务器安全性进一步提升,可以避免阻断大部分的恶意暴力密码爆破. 在开始--运行菜单里,输入regedit 或者: 远程登陆服务器选择系统桌面中的"Windows Po ...
- PyTorch 于 JupyterLab 的环境准备
PyTorch 是目前主流的深度学习框架之一,而 JupyterLab 是基于 Web 的交互式笔记本环境.于 JupyterLab 我们可以边记笔记的同时.边执行 PyTorch 代码,便于自己学习 ...
- Kubernetes 开船记-脚踏两只船:用 master 服务器镜像克隆出新集群
自从2020年2月23日 园子全站登船 之后,我们一边感叹"不上船不知道,一上船吓一跳" -- kubernetes 比 docker swarm 强大太多,一边有一个杞人忧天的担 ...
- ESPNet/ESPNetV2:空洞卷积金字塔 | 轻量级网络
ESPNet系列的核心在于空洞卷积金字塔,每层具有不同的dilation rate,在参数量不增加的情况下,能够融合多尺度特征,相对于深度可分离卷积,深度可分离空洞卷积金字塔性价比更高.另外,HFF的 ...
- eNSP启动设备AR1失败记一次解决步骤
eNSP稳定版本下载: 微信搜索公众号"疯刘小三" 关注后回复ensp即可获得下载链接地址 eNSP V100R002C00B510 Setup.exe 最近在用eNSp的时候 ...
- Eclipse在线安装FatJar插件失败解决方案
在线安装fatjar(URL:http://kurucz-grafika.de/fatjar) 快要安装完的时候报错如下: 找了很久解决方法,终于有了下文:很是粗乎意料呃,下载一个eclipse2.0 ...
- Redis布隆过滤器与布谷鸟过滤器
大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们业务后端涉及数据库,当请求消息查询某些信息时,可能先检查缓存中是否有 ...
- QQ好友状态,QQ群友状态,究竟是推还是拉? 网页端收消息,究竟是推还是拉?
https://mp.weixin.qq.com/s/KB1zdKcsh4PXXuJh4xb_Zw 网页端收消息,究竟是推还是拉? 原创 58沈剑 架构师之路 2020-12-28 https:/ ...
- Crypto.getRandomValues()
Crypto.getRandomValues() - Web APIs | MDN https://developer.mozilla.org/en-US/docs/Web/API/Crypto/ge ...