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;
}

posted @ 2012-07-12 08:54  willzhang  阅读(198)  评论(0编辑  收藏  举报