dp专辑 G - Fibonacci [ 快速幂]

来源:互联网 发布:淘宝直播论坛手机版 编辑:程序博客网 时间:2024/06/05 04:19

第一反映这一题也属于DP???是数学题呀,呵呵~不管了,开始做了......


题意:

求 斐波那契数列 的第n项,输出Fn mod 10000



思路:

快速幂

 模板:

long long qpow(int a, int b)
{
         long long c, d;
         c = 1;    //存a^b
         d = a;    //存a的倍幂
         while (b > 0)
         {
                 if (b & 1)     //或 if (b % 2 == 1)
                        c *= d;
                 b = b >> 1;   //或  b = b / 2
                 d = d * d;
          }
         return c;
}

稍微修改下就可以了~


//AC CODE:

#include<iostream>#include<cmath>#include<algorithm>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>#include<string>using namespace std;struct Mat{    int p[2][2];};Mat mul(Mat c, Mat b){    Mat result;    result.p[0][0] = (c.p[0][0]*b.p[0][0] + c.p[0][1]*b.p[1][0]) % 10000;    result.p[0][1] = (c.p[0][0]*b.p[0][1] + c.p[0][1]*b.p[1][1]) % 10000;    result.p[1][0] = (c.p[1][0]*b.p[0][0] + c.p[1][1]*b.p[1][0]) % 10000;    result.p[1][1] = (c.p[1][0]*b.p[0][1] + c.p[1][1]*b.p[1][1]) % 10000;    return result;}int qpow(int N){    Mat  c, d;    c.p[0][0] = 1;    c.p[0][1]=0;    c.p[1][0]=0;    c.p[1][1]=1;    //存a^b    d.p[0][0] = 1;    d.p[0][1]=1;    d.p[1][0]=1;    d.p[1][1]=0;    //存a的倍幂    while (N > 0)    {        if (N & 1)     //或 if (b % 2 == 1)            c = mul(c,d);        N = N >> 1;   //或  b = b / 2        d = mul(d,d);    }    return c.p[0][1];}int main(){    int N;    while(scanf("%d",&N)!=EOF&& N!=-1)    {        printf("%d\n",qpow(N));    }    return 0;}



原创粉丝点击