POJ 3070 矩阵快速幂
来源:互联网 发布:linux和windows传文件 编辑:程序博客网 时间:2024/05/17 07:33
Description
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给得又是那么得大,所以用暴力的解法肯定是TLE的,所以我们想到了快速幂的方法,只要把其中的乘法换成矩阵的乘法法则即可。
//base的n次方.快速幂方式int fast_mod(int n,int base){ int ans = 1; while(n) { if(n&1) ans = ans*base%mod; base = base*base%mod; n>>=1; } return ans;}
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>#include <map>#include <iostream>using namespace std;long long phi[3000010];const int mod = 10000;struct matrix{ int m[2][2];}a,base;matrix xiangcheng(matrix a,matrix base)//矩阵乘法的代码{ matrix temp; for (int i = 0; i<2; i++) { for (int j = 0; j<2; j++) { temp.m[i][j] = 0; for (int k = 0; k<2; k++) { temp.m[i][j] =(temp.m[i][j]+a.m[i][k]*base.m[k][j])%mod; } } } return temp;}int fast_mod(long long n){ base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; //初始化base. a.m[0][0] = a.m[1][1] = 1; a.m[0][1] = a.m[1][0] = 0; //把a初始化成单位矩阵。 while (n) { //快速幂 if (n&1) { //判断最后一位是否为1. a = xiangcheng(a, base); //换成矩阵乘法. } base = xiangcheng(base, base); n>>=1; //左移一位. } return a.m[0][1];}int main(){ long long n; cin>>n; while (n!=-1) { cout<<fast_mod(n)%mod<<endl; cin>>n; } return 0;}
- POJ 3070 矩阵快速幂
- poj 3070 矩阵快速幂
- poj 3070(矩阵快速幂)
- poj 3070 矩阵快速幂
- 矩阵快速幂 poj 3070
- POJ 3070 矩阵快速幂
- POJ 3070 矩阵快速幂
- POJ 3070 矩阵快速幂
- poj 3070 矩阵快速幂
- POJ 3070 矩阵快速幂
- poj 3070 矩阵快速幂
- 矩阵快速幂POJ-3070
- poj 3070 矩阵快速幂
- 矩阵快速幂 poj 3070
- POJ 3070 (矩阵快速幂,矩阵快速幂求斐波那契)
- POJ 3070 Fibonacci 矩阵快速幂
- poj 3070(矩阵的快速幂)
- poj - 3070 - Fibonacci(矩阵快速幂)
- IOS--JSON数据解析成字典
- java之集合Collection详解之2
- hdu 5365+hdu 5355
- 【vector】【bzoj 2083】Intelligence test
- 多路复用/多路分解
- POJ 3070 矩阵快速幂
- HDU - 1241 Oil Deposits
- 如何使用 Docker 部署一个基于 Play Framework 的 Scala Web 应用?
- 8月10日----数据库
- 【消息队列MQ】各类MQ比较
- JAVA 基础 (循环)
- VS2015 企业版不支持 JavaScript 语法高亮、智能提醒
- 聚合与组合
- JCIFS简介and利用JCIFS网络文件共享实现上传下载