矩阵快速幂——将运算推广到矩阵上HDU 1575

/*

本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式

最后通过计算就可以得到一个符合题目要求的矩阵,

然后就是将矩阵上面所有的对角线元素相加

得到的结果即为所求的目标

*/

#include<cstdio> 
#include<cstring> 
using namespace std; 
const int maxn = 15; 
#define mod 9973 
int res[maxn][maxn]; 
int n; 
void mul(int a[][15],int b[][15],int c[][15]){ 
    int temp[15][15];  memset(temp,0,sizeof(temp)); 
    for(int i=0;i<n;i++) 
      for(int j=0;j<n;j++) 
        for(int k=0;k<n;k++){
           temp[i][j]=(temp[i][j]+ a[i][k]*b[k][j] )%mod; 
        } 
    memcpy(c,temp,sizeof(temp)); 
}
void pow(int a[][15],int k){ 
     while(k){ 
         if(k&1){ 
             mul(res,a,res); 
         } 
         mul(a,a,a); 
         k>>=1; 
     //    printf("%d\n",k); 
     } 

int main(){ 
    int T,k; 
    int a[maxn][maxn]; 
    scanf("%d",&T); 
    while(T--){ 
        scanf("%d%d",&n,&k); 
        for(int i=0;i<n;i++)  for(int j=0;j<n;j++)  res[i][j]=(i==j); 
        //这个做法主要是将对角线标记出来,然后就可以与矩阵a相乘,最后得到的a矩阵就是一个对角矩阵
        for(int i=0;i<n;i++)  for(int j=0;j<n;j++)  scanf("%d",&a[i][j]); 
        pow(a,k); 
        int ans=0; 
        for(int i=0;i<n;i++) ans+=res[i][i]; 
        printf("%d\n",ans%mod); 
    } 
    return 0; 

//自己现在最大的问题就是知道矩阵相乘的方法,但是将一个数组的问题处理好就没办法了……

////////////////////////////////////////////////////////////////////////////////////////////////////////////

矩阵方面的问题处理参考方式

矩阵乘法
struct Matrix{
    long long mat[N][N];
    Matrix operator*(const Matrix m)const{
        Matrix tmp;
        for(int i = 0;i < n;i++){
            for(int j = 0;j < n;j++){
                tmp.mat[i][j] = 0;//完成初始化
                for(int k = 0;k < n;k++){
                    tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
                    tmp.mat[i][j] %= MOD;
                }}}
        return tmp;
//这个是通过new一个空间后达到目的的,所以后面会有空间的保留,可以通过这种方式将数组传递下来
    }
};

矩阵快速幂——将运算推广到矩阵上HDU 1575,布布扣,bubuko.com

时间: 2024-11-17 03:45:55

矩阵快速幂——将运算推广到矩阵上HDU 1575的相关文章

算法初步:快速乘,快速幂,矩阵快速幂

原创 by zoe.zhang 在刷题的时候遇到了问题,就是当循环或者递推的次数非常大的情况下获取一定结果,这个时候如果作普通运算,那么很容易就超时了,而且有时候结果也大得超范围了,即使是long long类型的也放不下,然后给了提示说是运用快速幂的思想.所以这里对快速幂做了一点思考和探讨. 1.快速乘,快速幂,矩阵快速幂三者的关系 不管是快速乘,还是快速幂算法,实际上都包含了分解问题的思想在里面,将O(n)的复杂度降到O(lgn).学习的时候,一般学习快速幂算法,再由此推广去解决矩阵快速幂问题

SHUOJ1857 Yaoge鸡排系列之九——好多鸡排!!!【矩阵快速幂】

转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://202.121.199.212/JudgeOnline/problem.php?id=1857 1857: Yaoge鸡排系列之九——好多鸡排!!! Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 98  Solved: 6 Description Yaoge买了n块鸡排,其中第n块鸡排的质量为M(n),同时

HDU2276 - Kiki &amp; Little Kiki 2(矩阵快速幂)

题目链接 题意:有n盏灯,编号从1到n.他们绕成一圈,也就是说,1号灯的左边是n号灯.如果在第t秒的时候,某盏灯左边的灯是亮着的,那么就在第t+1秒的时候改变这盏灯的状态.输入m和初始灯的状态.输出m秒后,所有灯的状态. 思路:其实每盏灯的状态之和前一盏和自己有关,所以可以得到一个关系矩阵.假设有6盏灯,因此可以得到关系矩阵如下: (1, 0, 0, 0, 0, 1) (1, 1, 0, 0, 0, 0) (0, 1, 1, 0, 0, 0) (0, 0, 1, 1, 0, 0) (0, 0,

HDU2842-Chinese Rings(递推+矩阵快速幂)

题目链接 题意:求出最少步骤解出九连环.取出第k个的条件是,k-2个已被取出,k-1个仍在支架上. 思路:想必九连环都玩过吧,其实最少步骤就是从最后一个环开始,向前一直取出来就行了.所以假设取出前n个环所需要的步骤为f(n),那么在此之前f(n - 2)要被取出,再加上1,即第n个环被取出,所以只剩下第n-1环没被取出,那么我们将前n-2环再套上去(套上去和取下来的步骤是一样,都为f(n - 2)),所以取出n-1环的步骤为f(n - 1),因此可以得到一个递推公式:f(n) = f(n - 2

探索(数学)(矩阵快速幂)(快速乘)

一句话题意:三维空间划分四维空间,最多能划分成多少个部分. 我们直接想四维的不好想,但是一般这种题我们考虑从低维开始做起. 在经过手算之后我们可以发现: 设\(f(x)\)为零维(点)切一维(线)最多划分的部分,递推式:\(f(x)=f(x-1)+1\) 设\(g(x)\)为一维(线)切二维(平面)最多划分的部分,递推式:\(g(x)=g(x-1)+f(x-1)\) 设\(k(x)\)为二维(平面)切三维(空间)最多划分的部分,递推式:\(k(x)=k(x-1)+g(x-1)\) 设\(h(x)

P3390 【模板】矩阵快速幂

题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格式: 输出A^k 共n行,每行n个数,第i行第j个数表示矩阵第i行第j列的元素,每个元素模10^9+7 输入输出样例 输入样例#1: 2 1 1 1 1 1 输出样例#1: 1 1 1 1 说明 n<=100, k<=10^12, |矩阵元素|<=1000 算法:矩阵快速幂 如题,矩阵快速幂. 已知,矩阵乘

细胞 (cell) 矩阵快速幂

细胞 (cell) 题目描述小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并观察细胞分裂的规律.他选取了一种特别的细胞,每天每个该细胞可以分裂出 x 1 个新的细胞.小 X 决定第 i 天向培养皿中加入 i 个细胞(在实验开始前培养皿中无细胞).现在他想知道第 n 天培养皿中总共会有多少个细胞.由于细胞总数可能很多,你只要告诉他总数对 w 取模的值即可.输入格式第一行三个正整数 n; x; w.输出格式一行一个数表示第 n 天的细胞总数对 w 取模的值.样例输入2 2 47

HDOJ 4686 Arc of Dream 矩阵快速幂

矩阵快速幂: 根据关系够建矩阵 , 快速幂解决. Arc of Dream Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 2164    Accepted Submission(s): 680 Problem Description An Arc of Dream is a curve defined by following fun

HDU 2294 Pendant (DP+矩阵快速幂降维)

HDU 2294 Pendant (DP+矩阵快速幂降维) ACM 题目地址:HDU 2294 Pendant 题意: 土豪给妹子做首饰,他有K种珍珠,每种N个,为了炫富,他每种珍珠都要用上.问他能做几种长度[1,N]的首饰. 分析: 1 ≤ N ≤ 1,000,000,000简直可怕. 首先想dp,很明显可以想到: dp[i][j] = (k-(j-1))*dp[i-1][j-1] + j*dp[i-1][j](dp[i][j]表示长度为i的并且有j种珍珠的垂饰有多少个) 然后遇到N太大的话,