POJ3070矩阵快速幂简单题
题意:
求斐波那契后四位,n <= 1,000,000,000.
思路:
简单矩阵快速幂,好久没刷矩阵题了,先找个最简单的练练手,总结下矩阵推理过程,其实比较简单,关键是能把问题转换成矩阵的题目,也就是转换成简单加减地推式,下面说下怎么样根据递推式构造矩阵把,这个不难,我的习惯是在中间插矩阵,就是比如斐波那契
a[n] = a[n-1] + a[n-2];
我的习惯是这样,首先要知道这个式子是有连续的两个项就可以推出第三个项
那么
a1 a2 0 1 a2 a3 这样就直接出来了中间矩阵,然后快速幂处理,这个是
1 1 最简单的了,一般都是要想办法各种转换,然后在构造式子
然后在快速幂,还有注意,矩阵可以把最下面那个循环拿到上面
然后通过if(mat[i][k])来优化,我下面的用了,这个要看0出现 的多不多(比较重要),还有可以通过调换循环位置(这个是底 层优化,不在算法范围之内)优化,推荐一个好题,杭电上有个 叫 什么什么233的那个,记得当时做那个题做的比较爽。
#include<stdio.h>
#include<string.h>
#define MOD 10000
typedef struct
{
int mat[3][3];
}M;
M matM(M a ,M b)
{
M c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int k = 1 ;k <= 2 ;k ++)
for(int i = 1 ;i <= 2 ;i ++)
if(a.mat[i][k])
for(int j = 1 ;j <= 2 ;j ++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
return c;
}
M qPowMat(M a ,int b)
{
M c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int i = 1 ;i <= 2 ;i ++)
c.mat[i][i] = 1;
while(b)
{
if(b&1) c = matM(c ,a);
a = matM(a ,a);
b >>= 1;
}
return c;
}
int main ()
{
int n ,i;
M star ,ans;
star.mat[1][1] = 0;
star.mat[1][2] = star.mat[2][1] = star.mat[2][2] = 1;
while(~scanf("%d" ,&n) && n != -1)
{
if(n == 0)
{
printf("0\n");
continue;
}
if(n == 1)
{
printf("1\n");
continue;
}
ans = qPowMat(star ,n);
printf("%d\n" ,(0 * ans.mat[1][1] + 1 * ans.mat[2][1]) % MOD);
}
return 0;
}
POJ3070矩阵快速幂简单题的更多相关文章
- luoguP3390(矩阵快速幂模板题)
链接:https://www.luogu.org/problemnew/show/P3390 题意:矩阵快速幂模板题,思路和快速幂一致,只需提供矩阵的乘法即可. AC代码: #include<c ...
- POJ3070 斐波那契数列递推 矩阵快速幂模板题
题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...
- 解题报告:poj 3070 - 矩阵快速幂简单应用
2017-09-13 19:22:01 writer:pprp 题意很简单,就是通过矩阵快速幂进行运算,得到斐波那契数列靠后的位数 . 这是原理,实现部分就是矩阵的快速幂,也就是二分来做 矩阵快速幂可 ...
- HDU 1575 矩阵快速幂裸题
题意:中文题 我就不说了吧,... 思路:矩阵快速幂 // by SiriusRen #include <cstdio> #include <cstring> using na ...
- POJ_Fibonacci POJ_3070(矩阵快速幂入门题,附上自己写的矩阵模板)
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10521 Accepted: 7477 Descri ...
- Final Destination II -- 矩阵快速幂模板题
求f[n]=f[n-1]+f[n-2]+f[n-3] 我们知道 f[n] f[n-1] f[n-2] f[n-1] f[n-2] f[n-3] 1 1 ...
- hdu 1575 求一个矩阵的k次幂 再求迹 (矩阵快速幂模板题)
Problem DescriptionA为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input数据的第一行是一个T,表示有T组数据.每组数据的第一行有 ...
- poj3070矩阵快速幂求斐波那契数列
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13172 Accepted: 9368 Desc ...
- POJ3070 矩阵快速幂模板
题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...
随机推荐
- 漏洞复现-CVE-2018-8715-Appweb
0x00 实验环境 攻击机:Win 10 0x01 影响版本 嵌入式HTTP Web服务器,<7.0.3版本 0x02 漏洞复现 (1)实验环境: 打开后出现此弹框登录界面: (2) ...
- celery 与 flask 实现异步任务调度
Flask 定了2中上下文,来实现机遇线程\协程的,wsgi服务的请求(request.session)和存储(g,current_app )过程,通过栈来完成不同线程和协程的上下文切换,在与cele ...
- sitemesh简单介绍
SiteMesh 是一个网页布局和修饰的框架,利用它可以将网页的内容和页面结构分离,以达到页面结构共享的目的. Sitemesh是由一个基于Web页面布局.装饰以及与现存Web应用整合的框架. 它能帮 ...
- java线程实现的三种方式以及静态代理
线程 一个进程中若开辟多个线程,线程的运行由调度器控制,先后顺序不能人为干预. 实现方式 继承 Thread类 调用run方法,只有主线程一条路 调用start方法,主线程和子线程并行交替执行 pub ...
- 攻防世界 reverse hackme
hackme XCTF 3rd-GCTF-2017 __int64 __fastcall sub_400F8E(__int64 a1, __int64 a2) { char input[136]; / ...
- 攻防世界 maze NJUPT CTF 2017
迷宫题 1 __int64 __fastcall main(__int64 a1, char **a2, char **a3) 2 { 3 signed __int64 mid_i; // rbx 4 ...
- java例题_13 加上100再加上168的完全平方数问题
1 /*13 [程序 13 根据条件求数字] 2 题目:一个整数,它加上 100 后是一个完全平方数,再加上 268 又是一个完全平方数,请问该数是多少? 3 程序分析:在 10万以内判断,先将该数加 ...
- IOC容器模拟实现
运用反射机制和自定义注解模拟实现IOC容器,使其具有自动加载.自动装配和根据全限定类名获取Bean的功能. 一. 实现原理 1-1 IOC容器的本质 IOC容器可理解为是一个map,其中的一个entr ...
- Codeforces1114C. Trailing Loves (or L'oeufs?)-(质因子分解)
题目大意: 求n!转化为b进制后后导0的个数 思路: 我们首先考虑十进制转化为二进制者后,后导0的个数如何求 十进制数num y = num%2 num/=2 如果y为0则,该位为0,就是求num能连 ...
- python基础(四):切片和索引
Python中的序列有元组.列表和字符串,因此我们都可以通过索引和切片的方式,来获取其中的元素. 索引 Python中的索引,对于正向索引,都是从0开始的.但是对于反向索引,确实从-1开始的.如图所示 ...