JAVA POJ3233—矩阵幂序列问题

限制时间:3000ms,限制空间:131072K。
问题描述:给定一个n×n的矩阵A和一个正整数k,求S=A+A2+A3+…+Ak。 输入格式:输入只包含一个测试用例。第一行输入包含三个正整数n(n≤30),k(k≤10^9)和m(m<10^4)。然后跟随n行,每行包含n个小于32,768的非负整数,以行序优先给出A的元素。 输出格式:以A的方式输出S,每个元素模m。
输入用例
2 2 4
0 1
1 1
输出用例
1 2
2 3

import java.util.Scanner; 
public class Main
{ static int MAXN=31;
 static int n,k,m;
 public static int [][] mult(int [][] a,int [][] b) //返回矩阵a和b相乘的矩阵
 { int n=a.length;
  int [][] c=new int[n][n];
  for (int i=0;i <n;i++)
   for (int j=0;j <n;j++)
   { for (int k=0;k <n;k++)
     c[i][j] += (a[i][k]*b[k][j]) % m;
    c[i][j] %= m;
   }
  return c;
 }
 public static int [][] pow(int [][] a,int k)  //返回a^k的矩阵
 { int n=a.length;
  int [][] ans=new int[n][n];     //建立ans矩阵
  for (int i=0;i <n;i++)      //置ans为单位矩阵
   ans[i][i]=1;
  int [][] base=new int[n][n];    //建立base矩阵
  for (int i=0;i <n;i++)      //置base=a
   for (int j=0;j <n;j++)
    base[i][j]=a[i][j];
  while(k!=0)
  { if ((k&1)==1)      //遇到二进制位1
    ans=mult(ans,base);
   base=mult(base,base);    //倍乘
   k >>= 1;        //右移一位
  }
  return ans;
 }
 public static void main(String[] args)
 {  Scanner fin = new Scanner(System.in);
  n = fin.nextInt();  
  k = fin.nextInt(); 
  m = fin.nextInt(); 
  int [][] a=new int[2*MAXN][2*MAXN];
  for (int i=0;i <n;i++)
  { for (int j=0;j <n;j++)
    a[i][j]=fin.nextInt();
   a[n+i][i]=a[n+i][n+i]=1;
  }
  a=pow(a,k+1);       //求出I+a+a^2+...+a^k
  for (int i=0;i <n;i++)
  { for (int j=0;j <n;j++)
   { int e=a[n+i][j]%m;
    if (i==j)
     e=(e+m-1)% m;    //减去I
    if (j==n-1)
     System.out.printf("%d\n",e);
    else
     System.out.printf("%d ",e);
   }
  }
 } 
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值