之前一直听说快速幂算法,但是也一直没有看过(好吧就是自己懒emmmm),上周月赛真的是沉重的打击啊,所以就好好的看了一下这个算法,整数快速幂和矩阵快速幂,反正思想都是一样的。

先看整数快速幂:

如果我们要算一个数的19次方,很简单,一个for循环不就好了嘛,但是如果是1900、1900000、19000000000呢?显然花费的时间就不是很乐观了,而用的时间多是因为乘的次数也就是计算的次数多,那么,如果我们用1+2+4+8+4来计算19次方呢?比起之前计算的19次,只要算5次就好了,当数据比较大时显然时间是会省很多的。

而整数快速幂的思想就是看数字的0 1表示,然后按位运算,比如算3的19次方,19是10011,就是2^4+2^1+2^0,起初让base=2^0=1,当你算的这一位是0,就可以跳过,只让base成倍增大,(因为你算下一位时base=base*3),当这一位是1的时候就乘上。

下面是整数快速幂的模板代码:

#include <iostream>int mian(void)
{int a,b;scanf("%d%d",&a,&b);//计算a的b次方 int re=1;while(b){if(b&1)//看b的二进制表示 现在运算的这一位是0还是1 {re=re*a;}a=a*a;b=b>>1;//b右移 }printf("%d\n",re);return 0;
}

矩阵快速幂的计算方法和整数快速幂其实是一样的,只不过把数的乘法换成了矩阵运算而已。(矩阵乘法如果不太清楚的请自行百度)……但是矩阵快速幂之所以叫矩阵快速幂(肯定还是有不一样的嘛)它反映的其实是一种递推,其中最典型的就是斐波那契数列的求解问题。(POJ3070)下面结合例题来说。

In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

.

Given an integer n, your goal is to compute the last 4 digits of Fn.

Input

The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.

Output

For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

Sample Input

0
9
999999999
1000000000
-1

Sample Output

0
34
626
6875

Hint

As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

.

Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

.

-----------------------------------------------------------------我只是个分割线哇-------------------------------------------------------------------------------

分析

其实题目有提示的,可以看这个矩阵

.

显然,需要算出

然后等式左边矩阵的第一行第一列就是递推下去的下一项。

这不是求n次方嘛,马上想到整数快速幂的思想

#include<iostream>
#include<cstdio>
#define maxn 3using namespace std;struct node
{long long a[maxn][maxn];
};node qmul(node g,node b){    //这个是矩阵的乘法运算,相当于整数快速幂中的乘上的那个数node c;for(int i=0;i<2;i++){for(int j=0;j<2;j++){c.a[i][j]=0;for(int k=0;k<2;k++){c.a[i][j]=(c.a[i][j]+(g.a[i][k]*b.a[k][j]))%10000;//c.a[i][j]=c.a[i][j]%Mod;}}}return c;
}
node mul(node mid,long long n)   //这个是中心思想,不过基本上和整数快速幂一样的
{node temp;for(int i=0;i<2;i++)   //整数快速幂初始化为1,矩阵当然是初始化为单位阵啦{for(int j=0;j<2;j++){temp.a[i][j]=(i==j);   //temp这个单位阵相当于上面例子中的re了,乘法器(是叫这个名字吧Orz)}}while(n){if(n&1){temp=qmul(temp,mid);}n/=2;mid=qmul(mid,mid);}return temp;
}
int main(void)
{long long n;node mid;   //定义了那个需要乘n次方的那个矩阵,相当于上面整数快速幂例子中的awhile(~scanf("%lld",&n)){if(n==0){printf("0\n");continue;}if(n==-1)break;mid.a[0][0]=1;mid.a[0][1]=1;mid.a[1][0]=1;mid.a[1][1]=0;node re=mul(mid,n);printf("%lld\n",re.a[0][1]);}
}

emmmmm感觉自己真是垃圾啊,有不对的还请大佬们指正,感谢!

呼呼呼写完了真开心要去睡觉了

矩阵快速幂分析+POJ3070相关推荐

  1. POJ3070 Fibonacci【矩阵快速幂】

    Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20098 Accepted: 13850 Descripti ...

  2. POJ3070矩阵快速幂简单题

    题意:       求斐波那契后四位,n <= 1,000,000,000. 思路:        简单矩阵快速幂,好久没刷矩阵题了,先找个最简单的练练手,总结下矩阵推理过程,其实比较简单,关键 ...

  3. poj3070 Fibonacci 矩阵快速幂

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18084   Accepted: 12572 Descr ...

  4. POJ3070 矩阵快速幂模板

    题目:http://poj.org/problem?id=3070 矩阵快速幂模板.mod写到乘法的定义部分就行了. 别忘了 I ( ) 和 i n i t ( ) 要传引用! #include< ...

  5. POJ3070 Fibonacci(矩阵快速幂)

    用矩阵快速幂求fibonacci序列的第n项. /* *********************************************** Author :devil Created Tim ...

  6. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  7. hdu 2842 Chinese Rings 矩阵快速幂

    分析: 后面的环能不能取下来与前面的环有关,前面的环不被后面的环所影响.所以先取最后面的环 设状态F(n)表示n个环全部取下来的最少步数 先取第n个环,就得使1~n-2个环属于被取下来的状态,第n-1 ...

  8. BC#29A:GTY's math problem(math) B:GTY's birthday gift(矩阵快速幂)

    A: HDU5170 这题让比较a^b与c^d的大小.1<=a,b,c,d<=1000. 显然这题没法直接做,要利用对数来求,但是在math库中有关的对数函数返回的都是浮点数,所以这又要涉 ...

  9. 一文彻底搞懂快速幂(原理、实现、矩阵快速幂)

    前言 大家好,我是bigsai,之前有个小老弟问到一个剑指offer一道相关快速幂的题,这里梳理一下讲一下快速幂! 快速幂是什么? 顾名思义,快速幂就是快速算底数的n次幂.你可能疑问,求n次幂算n次叠 ...

  10. 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解

    传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...

最新文章

  1. 数据结构和算法之稀疏数组
  2. SicilyFunny Game
  3. matlab 读取照片imread,利用matlab读取图像
  4. 文件字节输入流 java
  5. 安卓学习笔记14:安卓手势操作编程
  6. 区块链100讲:Vitalik Buterin-以太坊Casper惩罚条件的最小化
  7. 多模态综述 | 一文了解Language-Vision预训练最新进展和新领域
  8. ubuntu18.04+RTX 3090安装docker并配置pytorch环境
  9. 搭建php实验报告_php实验报告..doc
  10. 如何构建OctoberCMS Widget插件
  11. Android中Home键的监听和拦截
  12. 关于未知的USB设备(设备描述符请求失败)的解决方法
  13. 软件测试最常见的面试题了解一下
  14. 搜狗百度seo推广优化需要注意的三大事项
  15. canvas教程大纲
  16. 洛谷P3387 【模板】缩点 (tarjan算法)
  17. 目标检测之Softer-NMS
  18. arduino蓝牙linux,Arduino Tian 开发板 Arduino yun升级 wifi 蓝牙 Linux限量
  19. 百度朱光:将技术基因注入百度金融,是我们未来三五年要做的事
  20. Java异常捕获论文_一篇文章解决Java异常处理

热门文章

  1. 入侵mssql2000
  2. 多个源文件进行编译,即 makefile 的编写
  3. 《windows程序设计(C语言版)》笔记
  4. 服务器系统开启telnet,开启Telnet服务
  5. 正则表达式的基本原理
  6. android打印机字体大小,热敏打印机字体大小设置,怎么设置打印机字体
  7. Python分析并绘制可视化动态地图,实时查询全球疫情数据(11月最新...)
  8. 全网最全python教程,从零到精通(学python有它就够必收藏)
  9. 电子嵌入式硬件软件培训
  10. 不要去深圳小梅沙海洋世界