华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1935|回复: 0
打印 上一主题 下一主题

矩阵快速幂

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2021-7-6 16:57:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. #include<iostream>
  2. #include<cstring>
  3. #define mod 1000000007
  4. #define ll long long
  5. using namespace std;
  6. struct Mat{
  7.     ll m[101][101];
  8. };
  9. Mat a,e;//a是输入的矩阵,e是单位矩阵
  10. ll n,p;
  11. Mat Mul(Mat x,Mat y) //矩阵乘
  12. {
  13.     Mat c;
  14.     for(int i=1;i<=n;i++)
  15.       for(int j=1;j<=n;j++)
  16.         c.m[i][j]=0;
  17.     for(int i=1;i<=n;i++)
  18.       for(int j=1;j<=n;j++)
  19.         for(int k=1;k<=n;k++)
  20.           c.m[i][j]=c.m[i][j]%mod+x.m[i][k]*y.m[k][j]%mod;
  21.     return c;
  22. }
  23. Mat pow(Mat x,ll y) //矩阵快速幂
  24. {
  25.     Mat ans=e;
  26.     while(y)
  27.     {
  28.         if(y&1)
  29.          ans=Mul(ans,x);  
  30.         x=Mul(x,x);
  31.         y>>=1;
  32.     }
  33.     return ans;
  34. }

  35. int main()
  36. {
  37.    
  38.     cin>>n>>p;
  39.     for(int i=1;i<=n;i++)
  40.       for(int j=1;j<=n;j++)
  41.         cin>>a.m[i][j];
  42.         
  43.     for(int i=1;i<=n;i++)
  44.         e.m[i][i]=1;   
  45.     Mat ans=pow(a,p);
  46.    
  47.     for(int i=1;i<=n;i++)
  48.     {
  49.         for(int j=1;j<=n;j++)
  50.           cout<<ans.m[i][j]%mod<<" ";
  51.         cout<<endl;
  52.     }  
  53.     return 0;
  54. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 14:29 , Processed in 0.093471 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表