矩阵乘法快速幂 codevs 1732 Fibonacci数列 2
在“1250 Fibonacci数列”中,我们求出了第n个Fibonacci数列的值。但是1250中,n<=109。现在,你的任务仍然是求出第n个Fibonacci数列的值,但是注意:n为整数,且1 <= n <= 100000000000000
输入有多组数据,每组数据占一行,为一个整数n(1 <= n <= 100000000000000)
输出若干行。每行输出第(对应的输入的)n个Fibonacci数(考虑到数会很大,mod 1000000007)
3
4
5
2
3
5
1 <= n <= 100000000000000
数据虽然大了,但是矩阵快速幂仍然可以解决,而且速度飞快,只要注意防止longlong 相乘溢出即可
#define N 3
#define ll long long
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
struct Jz{
int cal,line;
long long jz[N][N];
};
long long q=;
int read()
{
char s;
int ans=,ff=;
s=getchar();
while(s<''||s>'')
{
if(s=='-') ff=-;
s=getchar();
}
while(''<=s&&s<='')
{
ans=ans*+s-'';
s=getchar();
}
return ans*ff;
}
long long quick_mod(ll a,ll b)/*慢乘法防止溢出*/
{
a%=q;b%=q;
ll ans=;
while(b)
{
if(b&)
{
ans+=a;
ans%=q;//
}
b>>=;
a<<=;
a%=q;
}
return ans;
}
Jz martax(Jz x,Jz y)
{
Jz ans;
ans.line=x.line;
ans.cal=y.cal;
for(int i=;i<=ans.line;++i)
for(int j=;j<=ans.cal;++j)
{
ans.jz[i][j]=;
for(int k=;k<=x.cal;++k)
ans.jz[i][j]=(ans.jz[i][j]+quick_mod(x.jz[i][k],y.jz[k][j]))%q;
}
return ans;
}
long long Fast_martax(long long n)
{
if(n==||n==) return ;
n-=;
Jz ans,a;
a.cal=a.line=;
a.jz[][]=;a.jz[][]=;
a.jz[][]=;a.jz[][]=;
ans.line=;ans.cal=;
ans.jz[][]=;ans.jz[][]=;
while(n)
{
if(n&)
{
ans=martax(a,ans);
}
n>>=;
a=martax(a,a);
}
return ans.jz[][]%q;
}
int main()
{
long long n;
while(scanf("%lld",&n)==)
{
printf("%lld\n",Fast_martax(n));
}
return ;
}
矩阵乘法快速幂 codevs 1732 Fibonacci数列 2的更多相关文章
- 矩阵乘法快速幂 codevs 1250 Fibonacci数列
codevs 1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1 ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)
/* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...
- 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解
矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...
- [codevs]1250斐波那契数列<矩阵乘法&快速幂>
题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...
- 1250 Fibonacci数列(矩阵乘法快速幂)
1250 Fibonacci数列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 定义:f0=f1=1, f ...
- 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂
题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
- 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...
随机推荐
- 小白学Linux(五)--VI/VIM编辑器
我们操作文件,终究离不开编辑文件,对文件内容的编辑,Linux系统下,我们通常使用VI/VIM来编辑文件.VI是每个Linux都会自带的文本编辑器,VIM是VI的增强版,可能有些发行版本没有自带,可以 ...
- Android图像处理之Bitmap类
Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bitmap来实现 ...
- js实现拖拽
拖拽:最核心是三个事件,鼠标按下,鼠标移动,鼠标弹起.按下时激活拖拽,然后时刻根据鼠标的位置来更新物体的left和top值,达到跟随鼠标的效果,鼠标弹起则取消拖拽. 以下是代码: <!DOCTY ...
- android sdk无法更新或者更新缓慢的解决方案
win7安装android sdk老出 Fetching https://dl-ssl.google.com/android/repository/addon .这是android sdk不能连接到谷 ...
- ArcObject10.1降级至10.0
最开始接触ArcGIS版本是9.3,为了需要也安装了9.2进行开发:因为自己的电脑配置较低,所以跑不起10.0中文版:毕业工作后,行业内用10.1居多(虽然10.3已出):现在10.4都要出来了:由于 ...
- ArcGIS 10 SP5中文版(ArcGIS10补丁5中文版)
下载地址:百度网盘下载地址:http://pan.baidu.com/s/1o7qPGhk 来自:http://zhihu.esrichina.com.cn/?/sort_type-new__day- ...
- Linux平台Makefile文件的编写基础入门(课堂作业)
根据老师的要求,写一个超简单的makefile准备: 准备三个文件:file1.c, file2.c, file2.h file1.c: #include "file ...
- Python基础(6)--条件、循环
本文的主要内容是 Python 的条件和循环语句以及与它们相关的部分. 我们会深入探讨if, while, for以及与他们相搭配的else,elif,break,continue和pass语句. 本 ...
- App开发流程之增加预编译头文件
在继续增加预编译头文件前,先稍等. Xcode为我们创建了一个模板项目,很棒!但有一点不太令人满意,问题就在下图中: 这是一个新项目的初始文件目录,几乎所有文件都在同一级目录下,随着项目文件数量急速增 ...
- 【读书笔记】iOS-读取文本文件
一,文本文件的内容. 二,工程目录 三,ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional ...