poj 3070 矩阵快速幂模板

题意:求fibonacci数列第n项

 1 #include "iostream"
 2 #include "vector"
 3 #include "cstring"
 4 using namespace std;
 5
 6 typedef unsigned long int ULL;
 7 typedef vector<ULL> vec;
 8 typedef vector<vec> mat;
 9 const ULL P=10000;
10 int n,m;
11
12 mat mul(mat &A,mat &B)      //return A*B
13 {
14     mat C(A.size(),vec(B[0].size()));
15     for (int i=0;i<(int)A.size();i++)
16     {
17         for (int k=0;k<(int)B.size();k++)
18         {
19             for (int j=0;j<(int)B[0].size();j++)
20             {
21                 C[i][j]=(C[i][j]+A[i][k]*B[k][j])%P;
22             }
23         }
24     }
25     return C;
26 }
27
28 mat m_pow(mat A,int m)      //return A^m
29 {
30     mat B(A.size(),vec(A.size()));
31     for (int i=0;i<(int)A.size();i++)
32         B[i][i]=1;
33     while (m>0)
34     {
35         if (m&1)    B=mul(B,A);
36         A=mul(A,A);
37         m>>=1;
38     }
39     return B;
40 }
41
42 int main()
43 {
44     while (cin>>n)
45     {
46         if (n==-1)  break;
47         mat A(2,vec(2));
48
49         A[0][0]=1;  A[0][1]=1;
50         A[1][0]=1;  A[1][1]=0;
51
52         A=m_pow(A,n);
53         cout<<A[1][0]<<endl;
54     }
55 }
时间: 2024-11-05 16:10:38

poj 3070 矩阵快速幂模板的相关文章

POJ 3070 矩阵快速幂解决fib问题

矩阵快速幂:http://www.cnblogs.com/atmacmer/p/5184736.html 题目链接 #include<iostream> #include<cstdio> using namespace std; typedef long long ll; #define MOD 10000 ll a[7],b[7],a0[7],b0[7]; void pow_mod(ll n) { a0[1]=a0[2]=a0[3]=1,a0[4]=0; b0[1]=b0[4]=

Fibonacci (poj 3070 矩阵快速幂)

Language: Default Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10099   Accepted: 7211 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

POJ 3070 矩阵快速幂

裸题,最简单fib的应用模板,算是新技能get 吧. 其实和快速幂差不多了,只是矩阵代替的递推式. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int maxn = 1005; 6 struct node 7 { 8 int a[2][2]; 9 void init() 10 { 11 a[0][0] = a[1][0] =

poj 3070 矩阵快速幂简单题

基本运用,基本是模板题. 求fi[n].       (1,1)    *( 1  ) ( 1,0)     (  0) #include<iostream> #include<cstring> using namespace std; struct juz { int bat[3][3]; int x,y; //行 列 }; juz mutp(juz a,juz b) { juz c; c.x=a.x;c.y=b.y; memset(c.bat,0,sizeof(c.bat));

51nod1113(矩阵快速幂模板)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1113 题意:中文题诶- 思路:矩阵快速幂模板 代码: 1 #include <iostream> 2 #define ll long long 3 using namespace std; 4 5 const int mod = 1e9+7; 6 const int MAXN = 1e2+10; 7 int n, m; 8 9 typedef struct

矩阵快速幂模板篇

转载请注明出处:http://blog.csdn.net/u012860063 或许你们看不太懂,纯属自用: 第一种: Description Let's define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n-1) + f(n-2), n > 1 When a = 0 and b = 1, this sequence gives the Fibonacci seq

矩阵快速幂 模板

矩阵快速幂模板 1 #include<stdio.h> 2 #include<math.h> 3 #include<set> 4 #include<string.h> 5 using namespace std; 6 int const mod=1e9+7; 7 struct matrix 8 { 9 long long m[3][3]; 10 matrix() 11 { 12 memset(m,0,sizeof(m)); 13 } 14 matrix op

HDU1575--Tr A(矩阵快速幂模板)

Tr A Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据.接下来有n行,每行有n

HDU-1575-Tr A(矩阵快速幂模板)

Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973. Input 数据的第一行是一个T,表示有T组数据. 每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据.接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容. Output 对应每组数据,输出Tr(A^k)%9973. Sample Input 2 2 2 1 0 0 1 3 99999