Fzu 2198 快来快来数一数【矩阵快速幂】
Accept: 218 Submit: 704
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
FOJ有奖月赛-2015年10月
思路:
暴力打表得到四项,6 35 204 1189.
不难看出,F【i】=F【i-1】*6-F【i-2】;
那么构造矩阵为:
然后跑矩阵快速幂即可。
然而直接跑会TLE,在网上题解找到了一种优化常数的方法(极限数据其实还是会卡掉这种做法的。)
先预处理出64个乘方矩阵,然后对于n来讲,如果某一位为1的时候再向上乘一个乘方矩阵。
Ac代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define ll __int64
typedef struct Matrix
{ll mat[3][3];
}matrix;
ll mod=1e9+7;
matrix A,B,Tmp[75];
Matrix matrix_mul(matrix a,matrix b)
{matrix c;memset(c.mat,0,sizeof(c.mat));int i,j,k;for(int i=0;i<3;i++){for(int k=0;k<3;k++){if(a.mat[i][k]==0)continue;for(int j=0;j<3;j++){c.mat[i][j]=(c.mat[i][j]+((a.mat[i][k]*b.mat[k][j]))+mod)%mod;}}}return c;
}
Matrix matrix_quick_power(matrix a,ll k)
{matrix b;memset(b.mat,0,sizeof(b.mat));for(int i=0;i<3;i++)b.mat[i][i]=1;//单位矩阵bwhile(k){if(k&1){b=matrix_mul(a,b);k-=1;}else{a=matrix_mul(a,a);k/=2;}}return b;
}
void init()
{A.mat[0][0]=6;A.mat[0][1]=-1;A.mat[0][2]=0;A.mat[1][0]=1;A.mat[1][1]=0;A.mat[1][2]=0;A.mat[2][0]=6;A.mat[2][1]=-1;A.mat[2][2]=1;Tmp[1]=A;for(int i=2;i<=64;i++){Tmp[i]=matrix_mul(Tmp[i-1],Tmp[i-1]);}
}
int main()
{int t;init();scanf("%d",&t);while(t--){ll n;scanf("%I64d",&n);memset(B.mat,0,sizeof(B.mat));for(int i=0;i<3;i++)B.mat[i][i]=1;int i=1;while(n){if(n&1){B=matrix_mul(B,Tmp[i]);}n/=2;i++;}printf("%I64d\n",(B.mat[2][0]+mod)%mod);}return 0;
}
Fzu 2198 快来快来数一数【矩阵快速幂】相关推荐
- 数绵羊(矩阵快速幂)
问题描述 一个数:1234567891011121314151617181920-,数到了N,那么形成的这个数字除以1000000007的余数是多少呢? 输入描述 一行,一个整数N,如题目描述 输出描 ...
- foj2198 Problem 2198 快来快来数一数 dp 矩阵快速幂
Problem 2198 快来快来数一数 Accept: 67 Submit: 194 Time Limit: 1000 mSec Memory Limit : 65536 KB Problem De ...
- 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂
题意:有若干字符,现在要把它们连成一个字符串,每种字符后面只能接特定种类的字符,现在询问能连接出的长度小于等于m的字符串有多少种. 思路:我们可以把这个转移关系看成一个图,如果字符a后面可以接b,那么 ...
- leetcode509. 斐波那契数(矩阵快速幂)
斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = F( ...
- 牛客练习赛27 F-计数(状压+限制初末状态的矩阵快速幂)
传送门 假如不是环,很简单 定义f[i][j]f[i][j]f[i][j]枚举到第iii个数字最后五个数字状态是jjj 那么显然可以矩阵快速幂求解 初始矩阵aaa是111行(1<<m)−1 ...
- [蓝桥杯][算法训练VIP]麦森数(Java大数+快速幂)
题目描述 形如2p-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2p-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有9 ...
- 【codevs1087NOIP2003】麦森数,高精度+对数+快速幂
麦森数 2003年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 形如2P-1的素数称为麦森数,这时P ...
- FZU 2198 快来快来数一数(矩阵快速幂)
/* a[i]=6*a[i-1]-a[i]+1;矩阵快速幂+预处理vc++可过.... */ # include <stdio.h> # include <algorithm> ...
- FZU 1683 纪念SlingShot (简单的矩阵快速幂)
纪念SlingShot Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,F(2)=5,对于给 ...
最新文章
- 45个案例一一破解win32k.sys蓝屏
- css在线留言星号,使用CSS 给表单必选项添加星号的实现方法
- MySQL的explain简书_MySQL Explain
- java 短链接实现方案_java利用百度短网址api实现URL长短互换工具类分享
- 图像融合亮度一致_重磅干货低光图像处理方案
- 关于Java中serialUID的序列化的问题
- 小程序读取云服务器,小程序读取云服务器
- 连载8:时域信号相乘相当于频域卷积
- 树莓派学习路程No.1 树莓派系统安装与登录 更换软件源 配置wifi
- Linux安装yum(最全依赖包)
- javascript 中时区知识的整理 UTC GMT
- z-buffer算法
- 微端游戏启动器launcher的制作(序篇)
- 随笔二——JavaScript脚本语言
- 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...
- 大数据云计算技术概述_云计算–概述,类型,优势和未来范围
- abaqus python_abaqus python脚本入门
- 排查Java宕机,weblogic宕机问题排查
- 在 Apple 芯片设备上用 Android Studio?别忘了使用 Apple 芯片预览版!
- 绘画语言的要素形状b节奏c立面d色彩,环境艺术设计理论考试题目资料.doc