杭电_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;
}

矩阵快速幂专题(一)

最近闲来无事,准备集中精力刷一波数论与图论。矩阵快速幂是数论里面的重要组成部分,值得我好好学习一下。因为题目比较多,分析也比较多,所以将此专题分成几个部分。做完这一专题,可能会暂时转向图论部分,然后等...
  • shengtao96
  • shengtao96
  • 2016年03月25日 22:45
  • 1058

矩阵快速幂总结

矩阵快速幂 基础知识:(会基础的直接看应用部分) (1) 矩阵乘法 简单的说矩阵就是二维数组,数存在里面,矩阵乘法的规则:A*B=C 其中c[i][j]为A的第i行与B的第j列对应乘积的和,即: ...
  • wust_zzwh
  • wust_zzwh
  • 2016年11月25日 15:40
  • 8076

算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现

快速幂 快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。 快速幂实现原理 快速幂的原理比较好懂,就是说假如我们...
  • chenfs1992
  • chenfs1992
  • 2014年12月24日 22:51
  • 7733

POJ3070矩阵快速幂求Fib

欲哭无泪。。。。。比赛的时候都敲不出来。。 Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Tota...
  • u012350533
  • u012350533
  • 2013年10月08日 23:50
  • 931

快速幂或者矩阵快速幂

快速幂或者矩阵快速幂在算指数时是很高效的,他的基本原理是二进制,下面的A可以是一个数也可以是一个矩阵(本文特指方阵),若是数就是快速幂算法,若是矩阵就是矩阵快速幂算法,用c++只需把矩阵设成一个类就可...
  • u011401504
  • u011401504
  • 2013年08月04日 22:17
  • 10071

java实现矩阵快速幂算法

java实现矩阵快速幂算法
  • y937498174
  • y937498174
  • 2015年04月24日 09:53
  • 1121

一类常见的矩阵快速幂题型 总结

Googlecode jam 2008 Round 1A(c.Numbers) 【题意】计算的小数点前三位数,不足三位补0,正整数n的最大值为20亿。 【前提】:满足 的值在【0,1】范围 首...
  • u013050857
  • u013050857
  • 2015年09月21日 23:59
  • 1028

快速幂,矩阵快速幂原理介绍

快速幂:复杂度为logn,比普通的n快了很多了.原理 :以求a的b次方来介绍: 首先把b转换成二进制数 该二进制数第i位的权为 2^i - 1 . 比如 : 11的二进制是1011 11 = 2³×...
  • Anxdada
  • Anxdada
  • 2017年06月21日 13:49
  • 278

C++_(矩阵)快速幂

#include #include using namespace std; const int MOD = 1000;int POW(long long &num); int times; lon...
  • a7055117a
  • a7055117a
  • 2016年05月14日 20:35
  • 915

HDU 2276 & FZU 1692 (矩阵快速幂+循环同构优化)

HDU 2276题意:给定一个01**字符串环**(20 比如当前的状态为100101那么一秒过后的状态为010111。思路:用公式表示变化状态其实就是: ai=(a(i+n−1)%n+ai)%2...
  • qq_15714857
  • qq_15714857
  • 2015年08月16日 22:26
  • 717
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杭电_hdu1757_矩阵解线性方程_快速幂乘
举报原因:
原因补充:

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