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 快来快来数一数相关推荐
- 苹果7支持快充吗_支持苹果20W+华为22.5W快充,倍思发布迷你数显快充移动电源...
日前倍思推出了移动电源新产品线:"迷你数显快充移动电源22.5W",黑白双色可选,10000mAh.20000mAh两种容量,重量仅有180g/330g,是同级中的轻量化选手,出门 ...
- Fzu 2198 快来快来数一数【矩阵快速幂】
Problem 2198 快来快来数一数 Accept: 218 Submit: 704 Time Limit: 1000 mSec Memory Limit : 65536 KB P ...
- foj2198 Problem 2198 快来快来数一数 dp 矩阵快速幂
Problem 2198 快来快来数一数 Accept: 67 Submit: 194 Time Limit: 1000 mSec Memory Limit : 65536 KB Problem De ...
- 数一数你连听都没听过的古典小说有多少?
作者:www.gudianxiaoshuo.com 数一数你连名字都没听过的古典小说有多少? 先秦 先秦汉魏晋南北朝诗 屈原全集 汉代诗歌 诗经 词 [全唐五代词] 宋词三百首 晏几道词全集 欧阳修词 ...
- linux查看单词个数,Linux怎么统计文本的的行数/单词数和字符数?
Linux怎么统计文本的的行数/单词数和字符数? Linux系统中想要统计文本的行数.单词和字符数量,该怎么统计呢?我们可以使用SecureCRT来统计,下面我们就来看看详细的教程. 1.启动Linu ...
- 荣耀9i支持鸿蒙系统吗,让快更快荣耀Play发布 吓人技术终于来了
中关村在线消息:下午14:30,荣耀在北京大学生体育馆召开新品发布会.会上为我们带来了荣耀Play.荣耀9i两款新机,那项"吓人的技术"终于得到了解读,那就是GPU Turbo,用 ...
- Java的快读快输出
众所周知,Java Scanner类的读入的真的真的慢 在我们使用Scanner类进行读入数据时,数据一旦过万,他就会显得非常慢 而用StreamTokenizer类差不多好像是要比Scanner快个 ...
- 笔试中题目的时间复杂度以及快读快写介绍
本篇主要分享下近期笔试中, 关于时间复杂度得一些经验. 1.题目格式以及快读快写 目前比较流行的题目格式大致有两种, 一种是核心代码格式(以力扣为主), 另一种是ACM格式(NOIP为主) ...
- Catalan数——卡特兰数
今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来 后来查了下,原来是Catalan数.悲剧啊,现在整理一下 Catalan数--卡特兰数] 一.Catalan数的定义令h( ...
- 【C++快读快输详解(快速读入数字,快速输出数字)】
众所周知,C++自带读入(废话),如 int a; cin>>a; 这个读入简单方便,但到后面,读的东西多了,读的也就显得慢些,所以有了下面的方式 int a; scanf("% ...
最新文章
- 监控告警满飞天,运维在家睡到自然醒...
- Python编程软件的安装与使用——Windows、Linux和Mac
- 【转】UNITY之LUA加密
- DVWA设置mysql_解决DVWA配置报错
- node-red教程2 第一条数据流
- 如何在六个月或更短的时间内成为DevOps工程师(一)
- gms签名不一致_电子签名拍照-多媒体互动装置介绍「振邦视界」
- python基础教程 pdf github_GitHub - looly/python-basic: 老齐(qiwsir)的Python基础教程Gitbook版...
- oracle 安装包_【Oracle监控】-Spotlight On Oracle安装和使用
- atitit.项目设计模式---ioc attilax总结
- CImage::Loda 方法加载图片失败,因为vs2013中该方法不支持中文变量
- 用数据分析验证,王者荣耀完胜阴阳师,小学生才是最终的赢家
- 互联网日报 | 4月26日 星期一 | 快手二次元日活跃用户突破1亿;小米全球范围内专利达1.9万件;艺龙酒店首家旗舰店在沪开业
- python生成指定长度的列表_python怎样创建具有一定长度和初始值的列表
- velocity学习(2)--VTL 语法
- Vue 组件事件触发另一个组件的事件
- 无法从[C:\My Java\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\conf\server.xml]加载服务器配置
- 《Emotion Cause Detection with Linguistic Construction》
- 7805和78l05可以代换吗_78L05和7805的引脚有何不同??
- 收藏:关于色彩的心理重量