首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

fibonacci(高速幂取模)

2013-09-05 
fibonacci(快速幂取模)//PKU 3070 ,calculate Fibonacci #include iostream#includestackint FPM(int)

fibonacci(快速幂取模)

//PKU 3070 ,calculate Fibonacci 
#include <iostream>
#include<stack>
int FPM(int);//fast-power-modulus function declare
using namespace std;
const int Mod=10000;
int main(int argc, char *argv[])
{
    int n=0;
    while(scanf("%d",&n))
    {
        if(n==-1)
            break;
        printf("%d\n",FPM(n));
    }
    
    return 0;
}
int FPM(int n)//fast-power-modulus function
{
    int matr[4]={1,0,0,1};//initialize matrix
    stack<bool>dec;//stack to store binary digit
    while(n)//resolve n to binary digit
    {
        dec.push(1&n);//get the last binary digit
        n>>=1;
    }
    while(!dec.empty())
    {
     //matrix square
        matr[1]=((matr[0]+matr[3])*matr[1])%Mod;
        matr[0]=(matr[0]*matr[0]+matr[2]*matr[2])%Mod;
        matr[3]=(matr[3]*matr[3]+matr[2]*matr[2])%Mod;
        matr[2]=matr[1];
    //matrix multiply,
        if(dec.top())
        {
            matr[0]=(matr[0]+matr[1])%Mod;
            matr[1]=(matr[1]+matr[3])%Mod;
            matr[3]=matr[2];
            matr[2]=matr[1];
        }
        dec.pop();
    }
    return matr[1];//matr[1] is the result F[N]

}

http://www.cppblog.com/sdz/archive/2009/08/16/93471.html
代码中Mod有什么用意?
当n较大时,对Mod取模得到的fibonacci数显然是错误的

分享到:
[解决办法]
你先把题目要你求什么给看懂。
[解决办法]
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).

热点排行