杭电_hdu1757_矩阵解线性方程_快速幂乘

原创 2011年01月20日 13:33:00

/* 


f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10)
构造的矩阵是:

|0   1   0 ..... 0|     |f0|    |f1 |
|0   0   1   0 . 0|     |f1|    |f2 |
|................1|  *  |..| =  |...|
|a9  a8  .......a0|     |f9|    |f10|

*/

#include<iostream>
#include<cstdio>
#include<cmath>

struct mat
{
    int m[10][10];
};
int n,k;

mat product(mat a,mat b)         //矩阵相乘
{
    mat c;
    memset(c.m,0,sizeof(c.m));
    int i,j,l;
    for(i=0;i<10;i++)
        for(j=0;j<10;j++)
        {
            for(l=0;l<10;l++)
                c.m[i][j]+=a.m[i][l]*b.m[l][j]%k;
            c.m[i][j]%=k;
        }
        return c;
}

mat div(mat a,int x)   //快速幂乘
{
    if(x==1)
        return a;
    else if(x&1)
        return product(div(a,x-1),a);
    else
    {
        mat temp=div(a,x>>1);
        return product(temp,temp);
    }
}

int main()
{
    mat a;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        if(n<10)
        {
            printf("%d",n%k);
            continue;
        }
        int i,j;
        for(i=9;i>=0;i--)
            scanf("%d",&a.m[9][i]);
        for(i=0;i<9;i++)
            for(j=0;j<10;j++)
                if(i==j-1)
                    a.m[i][j]=1;
                else
                    a.m[i][j]=0;
                mat b=div(a,n-9);
                int ans=0;
                for(i=0;i<10;i++)
                    ans+=b.m[9][i]*i%k;
                printf("%d/n",ans%k);
    }
    return 0;
}

相关文章推荐

HDU 1757 A Simple Math Problem 矩阵快速幂

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O...

HDU 1757 A Simple Math Problem (矩阵快速幂模板)

A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O...
  • sizaif
  • sizaif
  • 2017年08月09日 17:00
  • 88

HDU 1757 A Simple Math Problem(矩阵快速幂)

Description Lele now is thinking about a simple function f(x). If x If x >= 10 f(x) = a0 * f...

矩阵快速幂 hdu1757

#include #include #include typedef long long ll; using namespace std; struct matrix { ll m[10][1...

HDU 1757 A Simple Math Problem (矩阵+快速幂)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意:已知当n 分析:矩阵快速幂.....和nyoj 301题递推求值差不多,构造矩阵即可。ht...
  • w20810
  • w20810
  • 2015年02月22日 18:05
  • 308

【矩阵快速幂】hdu 1757

不解释 #define N 10 int MOD ; struct Mat{ int mat[10][10]; }; //初始化单位矩阵 Mat init(){ Mat E; ...
  • leolin_
  • leolin_
  • 2011年10月22日 22:00
  • 437

HDU 1757 矩阵快速幂

传送门: HDU 1757题解: 简单的矩阵构造 构造矩阵时注意数组不要溢出, 或者把数组开大 构造 |0 1 0 ……… .0| * |f(0)| = | f(1) | ...
  • ADjky
  • ADjky
  • 2016年10月11日 21:21
  • 137

快速矩阵幂 HDU1757

矩阵的快速幂是用来高效地计算矩阵的高次方的。将朴素的o(n)的时间复杂度,降到log(n)。 这篇文章很好得分析了原理:http://www.cnblogs.com/yan-boy/archive/...

HDU 1757 A Simple Math Problem(矩阵快速幂)

大意:给定函数的初始值,以及地推公式的系数和关系求最终的结果。思路:裸的快速幂,主要是构建矩阵的问题。 由If x >= 10 f(x) = a0 * f(x-1) + a1 * f(x-2) + ...

HDU 1757 A Simple Math Problem [矩阵快速幂]

题目链接: HDU 1757 A Simple Math ProblemProblem Description Lele now is thinking about a simple functi...
  • yoer77
  • yoer77
  • 2017年04月19日 18:36
  • 146
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杭电_hdu1757_矩阵解线性方程_快速幂乘
举报原因:
原因补充:

(最多只允许输入30个字)