poj 3070 Fibonacci

http://poj.org/problem?id=3070

矩阵的快速幂,二分

 1 #include <cstdio>
2 #include <cstring>
3 #include <algorithm>
4 #define maxn 10000
5 using namespace std;
6 const int mod=10000;
7
8 int n;
9 struct node
10 {
11 int a[4][4];
12 };
13
14 node multi(node s,node t)
15 {
16 node c;
17 for(int i=0; i<2; i++)
18 {
19 for(int j=0; j<2; j++)
20 {
21 c.a[i][j]=0;
22 for(int k=0; k<2; k++)
23 {
24 c.a[i][j]=(c.a[i][j]+s.a[i][k]*t.a[k][j])%mod;
25 }
26 }
27 }
28 return c;
29 }
30
31
32 int main()
33 {
34 while(scanf("%d",&n)!=EOF)
35 {
36 if(n==-1) break;
37 node m,x;
38 m.a[0][0]=1; m.a[0][1]=0;
39 m.a[1][0]=0; m.a[1][1]=1;
40 x.a[0][0]=x.a[0][1]=x.a[1][0]=1;
41 x.a[1][1]=0;;
42 while(n)
43 {
44 if(n&1)
45 {
46 m=multi(m,x);
47 }
48 x=multi(x,x);
49 n>>=1;
50 }
51 printf("%d\n",m.a[0][1]);
52 }
53 return 0;
54 }

poj 3070 Fibonacci,布布扣,bubuko.com

时间: 2024-12-18 19:05:20

poj 3070 Fibonacci的相关文章

poj 3070 Fibonacci (矩阵快速幂求斐波那契数列的第n项)

题意就是用矩阵乘法来求斐波那契数列的第n项的后四位数.如果后四位全为0,则输出0,否则 输出后四位去掉前导0,也...就...是...说...输出Fn%10000. 题目说的如此清楚..我居然还在%和/来找后四位还判断是不是全为0还输出时判断是否为0然后 去掉前导0.o(╯□╰)o 还有矩阵快速幂的幂是0时要特判. P.S:今天下午就想好今天学一下矩阵乘法方面的知识,这题是我的第一道正式接触矩阵乘法的题,欧耶! #include<cstdio> #include<iostream>

[2016-02-04][POJ][3070][Fibonacci]

[2016-02-04][POJ][3070][Fibonacci] POJ - 3070 Fibonacci Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn ? 1 + Fn ? 2 for n ≥ 2. For examp

矩阵快速幂 POJ 3070 Fibonacci

题目传送门 1 /* 2 矩阵快速幂:求第n项的Fibonacci数,转置矩阵都给出,套个模板就可以了.效率很高啊 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cstring> 7 #include <cmath> 8 using namespace std; 9 10 const int MAXN = 1e3 + 10; 11 const int INF = 0x3f3f3f3f;

POJ 3070 Fibonacci 矩阵快速求法

就是Fibonacci的矩阵算法,不过增加一点就是因为数字很大,所以需要取10000模,计算矩阵的时候取模就可以了. 本题数据不强,不过数值本来就限制整数,故此可以0ms秒了. 下面程序十分清晰了,因为分开了几个小函数了,适合初学者参考下. #include <stdio.h> const int MOD = 10000; void mulOneMatrix(int F[2][2]) { int a = F[0][0]; int b = F[1][0]; F[0][0] = (a+b)%MOD

POJ 3070 Fibonacci(矩阵快速幂)

题目链接 题意 : 用矩阵相乘求斐波那契数的后四位. 思路 :基本上纯矩阵快速幂. 1 //3070 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 6 using namespace std; 7 8 struct Matrix 9 { 10 int v[2][2]; 11 }; 12 int n; 13 14 Matrix matrix_mul(Matrix a,Matrix b) 1

POJ 3070 Fibonacci(矩阵高速功率)

职务地址:POJ 3070 用这个题学会了用矩阵高速幂来高速求斐波那契数. 依据上个公式可知,第1行第2列和第2行第1列的数都是第n个斐波那契数.所以构造矩阵.求高速幂就可以. 代码例如以下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include

poj 3070 Fibonacci 矩阵快速幂

题目链接:http://poj.org/problem?id=3070 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 t

矩阵经典题目六:poj 3070 Fibonacci

http://poj.org/problem?id=3070 按已构造好的矩阵,那么该矩阵的n次方的右上角的数便是f[n]. #include <stdio.h> #include <iostream> #include <map> #include <set> #include <list> #include <stack> #include <vector> #include <math.h> #inclu

poj 3070 Fibonacci(矩阵快速幂求Fibonacci数列)

题目链接: http://poj.org/problem?id=3070 题意: 我们知道斐波那契数列0 1 1 2 3 5 8 13-- 数列中的第i位为第i-1位和第i-2位的和(规定第0位为0,第一位为1). 求斐波那契数列中的第n位mod 10000的值. 思路: 这里的n很大,有10^9,for一遍肯定是不可以的. 所以要用矩阵乘法求斐波那契数列. f[n+1] = f[n]+f[n-1] f[n] = f[n] 构造以下矩阵,n次幂,mat[1][0] 就是答案 1 1 1 0 求矩