poj3070 Fibonacci

本文介绍了一种利用二进制表示和快速幂算法来高效计算矩阵幂的方法。通过将整数转换为二进制形式,并针对每个二进制位进行矩阵乘法运算,可以显著减少计算次数。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct T
{
    int er[200];
    int num;
};//n转换为二进制后的表示用数组存起来
T change(int n)
{
    T linshi;
    linshi.num=0;
    while(n!=0)
    {
        if(n%2==1)
        {
            linshi.er[linshi.num]=1;
            linshi.num++;
            n=(n-1)/2;
        }
        if(n%2==0)
        {
            linshi.er[linshi.num]=0;
            linshi.num++;
            n=n/2;
        }
    }
    return linshi;
}
int poww(int a,int b)
{
    int res=1;
    int i;
    for(i=1;i<=b;i++)
    {
        res*=a;
    }
    return res;
}
int p[30][4];//p[i][4]表示原矩阵的2^i次方
void cal(int ret[4],int m[4],int n[4])
{
    int i;
    int a[4];
    int b[4];
    for(i=0;i<4;i++)
    {
        a[i]=m[i];
        b[i]=n[i];
    }
    ret[0]=(a[0]*b[0]+a[1]*b[2])%10000;
    ret[1]=(a[0]*b[1]+a[1]*b[3])%10000;
    ret[2]=(a[2]*b[0]+a[3]*b[2])%10000;
    ret[3]=(a[2]*b[1]+a[3]*b[3])%10000;
}
void init()
{
    p[0][0]=1;
    p[0][1]=1;
    p[0][2]=1;
    p[0][3]=0;
    int i;
    for(i=1;i<30;i++)
    {
        cal(p[i],p[i-1],p[i-1]);
    }
}
int main()
{
    init();
    int n;
    while(scanf("%d",&n),n!=-1)
    {
        T bin;
        bin=change(n);
        int res[4]={1,0,0,1};
        int i;
        for(i=0;i<bin.num;i++)
        {
            if(bin.er[i]==0)
            {
                continue;
            }
            cal(res,res,p[i]);
        }
        printf("%d\n",res[2]);
    }
    return 0;
}

转载于:https://www.cnblogs.com/willzhang/archive/2012/07/12/2587400.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值