UVA 10518

来源:互联网 发布:天敏t2网络机顶盒 编辑:程序博客网 时间:2024/06/04 17:55

题意:
F(0)=0,F(1)=1;
F(n)=F(i-1)+F(i-2)
假设F(n)是一个函数,求调用函数的调用次数
思路:
很明显F(0)=F(1)=1;
F(n)=F(i-1)+F(i-2)+1
然后矩阵快速幂…

#include<stdio.h>#include<string.h>#include<iostream>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<string>#include<vector>#include<map>#include<set>using namespace std;#define lowbit(x) (x&(-x))typedef long long LL;const int maxn = 100005;const int inf=(1<<28)-1;#define Matrix_Size 5LL MOD;int Size;struct Matrix{    LL mat[Matrix_Size][Matrix_Size];    void clear()    {        memset(mat,0,sizeof(mat));    }    void output()    {        for(int i = 0;i < Size;i++)        {            for(int j = 0;j < Size;j++)                printf("%d ",mat[i][j]);            printf("\n");        }    }    Matrix operator *(const Matrix &b)const    {        Matrix ret;        for(int i = 0;i < Size;i++)            for(int j = 0;j < Size;j++)            {                ret.mat[i][j] = 0;                for(int k = 0;k < Size;k++)                {                    long long tmp = (long long)mat[i][k]*b.mat[k][j]%MOD;                    ret.mat[i][j] = (ret.mat[i][j]+tmp);                    if(ret.mat[i][j]>=MOD)                        ret.mat[i][j] -= MOD;                    if(ret.mat[i][j]<0)//注意是否需要MOD                         ret.mat[i][j] += MOD;                }            }        return ret;    }};Matrix pow_M(Matrix a,long long n){    Matrix ret;    ret.clear();    for(int i = 0;i < Size;i++)        ret.mat[i][i] = 1;    Matrix tmp = a;    while(n)    {        if(n&1)ret = ret*tmp;        tmp = tmp*tmp;        n>>=1;    }    return ret;}int main(){    LL n;    int Case=0;    while(~scanf("%lld%lld",&n,&MOD)&&!(n==0&&MOD==0))    {        printf("Case %d: %lld %lld ",++Case,n,MOD);        Size=3;        Matrix A,B;        A.clear();B.clear();        A.mat[0][0]=1,A.mat[0][1]=1,A.mat[0][2]=1;        A.mat[1][0]=1;        A.mat[2][2]=1;        B.mat[0][0]=1;B.mat[1][0]=1;B.mat[2][0]=1;        if(n==1||n==0)        {            printf("%d\n",1%MOD);            continue;        }        A=pow_M(A,n-1);        A=A*B;        printf("%lld\n",A.mat[0][0]);    }    return 0;}
0 0