poj 3070 斐波那契数列

来源:互联网 发布:优化储存空间照片恢复 编辑:程序博客网 时间:2024/05/25 12:20


Fibonacci
Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 10964 Accepted: 7795

Description

In the Fibonacci integer sequence, F0 = 0, F1 = 1, andFn = Fn − 1 + Fn − 2 forn ≥ 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 ofFn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., printFn mod 10000).

Sample Input

099999999991000000000-1

Sample Output

0346266875

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:

.

Source

Stanford Local 2006



矩阵的快速幂运算,函数无法返回二维数组就用结构体把它套起来,直接返回结构体。。

同时get了快速求斐波那契数列的新技能。


#include<map>#include<vector>#include<cstdio>#include<iostream>#include<cstring>#include<string>#include<algorithm>#include<cmath>#include<stack>#include<queue>#include<set>#define inf 0x3f3f3f3f#define mem(a,x) memset(a,x,sizeof(a))using namespace std;typedef long long ll;typedef pair<int,int> pii;inline int in(){    int res=0;    char c;    while((c=getchar())<'0' || c>'9');    while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();    return res;}struct node{    int a[2][2];    node()    {        a[0][0]=1;        a[0][1]=1;        a[1][0]=1;        a[1][1]=0;    }};node mul(node a,node b){    node res;    for(int i=0;i<2;i++)    {        for(int j=0;j<2;j++)        {            res.a[i][j]=0;           for(int k=0;k<2;k++)           {                res.a[i][j]+=a.a[i][k]*b.a[k][j]%10000;           }        }    }    return res;}node pow(node a,int n){    node res;    while(n)    {        if(n & 1)res=mul(res,a);        a=mul(a,a);        n>>=1;    }    return res;}int main(){    int n;    while(~scanf("%d",&n))    {        if(n==-1)break;        if(n==0)        {            puts("0");            continue;        }        node a;        node ans=pow(a,n-1);        printf("%d\n",ans.a[1][0]%10000);    }    return 0;}



0 0
原创粉丝点击