470. A simple math problem

链接:http://acm.whu.edu.cn/weblearn/problem/470

线性递推首先考虑 矩阵快速幂

long long 的范围为 9*10^18。 

#include
#include
#include
#include
using namespace std;
#define N 3
typedef long long LL;
 
LL n,m=11;
struct Matrix
{
    LL mat[N][N];
    Matrix()
    {
        memset(mat,0,sizeof(mat));
    }
};
 
Matrix mul(Matrix a,Matrix b)
{
    Matrix res;
    for(int i=0; i>=1;
        b=mul(b,b);
    }
    return res;
}  //模板上的输入变量是:矩阵、数据长度;灵活运用模板,依题目而变(说着轻松)
 
int main()
{
    while(~scanf("%lld",&n))
    {
        Matrix ans;
 
        ans.mat[2][0]=1;
        int x[9]= {0,1,1,2,2,3,3,3,4};
        if(n<9)
        {
            printf("%d\n",x[n]);
            continue;
        }
 
        LL t=10;
        for(int i=1; i<=18; i++)
        {
            ans=mul(pow_matrix(t,t-1),ans);
            t*=10;
 
            if(t>n)  break;
        }
        ans=mul(pow_matrix(t,n),ans);
        printf("%lld\n",ans.mat[0][0]);
    }
    return 0;
}

 

你可能感兴趣的:(线性递推)