• Matrix Power Series(POJ 3233 构造新矩阵求解+ 快速矩阵幂)


    题目大意:给定A,k,m(取模),求解S = A + A2 + A3 + … + Ak.

    思路:此题为求解幂的和,一开始直接一个个乘,TLE。时间消耗在累加上。此处巧妙构造新矩阵

    p=    A 0

        1 1   ,1 代表单位矩阵。那么p*p=A 0

                        A+1,1

    p*p*p=A*A 0

        A*A+A+1 1

    那么最后求得的结果就是左下角的矩阵减去一个单位矩阵。最后需要注意的是若在简单为矩阵的时候结果为负数,那么为m-1;

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <vector>
     6 using namespace std;
     7 
     8 typedef vector<int> vec;
     9 typedef vector<vec> mat;
    10 
    11 mat a,b;
    12 int n,k,m;
    13 mat mul(mat x,mat y)
    14 {
    15     mat c(2*n,vec(2*n));
    16     int sum;
    17     int i,j,w;
    18     for(i=0;i<2*n;i++)
    19         for(j=0;j<2*n;j++)
    20         {
    21             sum=0;
    22             for(w=0;w<2*n;w++)
    23                 sum=(sum+x[i][w]*y[w][j])%m;
    24             c[i][j]=sum;
    25         }
    26     return c;
    27 }
    28 
    29 mat m_pow(mat x,int p)
    30 {
    31     mat res(2*n,vec(2*n));
    32     int i;
    33     for(i=0;i<2*n;i++)
    34         res[i][i]=1;
    35     while(p>0)
    36     {
    37         if(p&1)
    38             res=mul(res,x);
    39         x=mul(x,x);
    40         p>>=1;
    41     }
    42     return res;
    43 }
    44 
    45 int main()
    46 {
    47     int i,j,x;
    48     freopen("in.txt","r",stdin);
    49     cin>>n>>k>>m;
    50     mat a(2*n,vec(2*n));
    51     
    52     for(i=0;i<n;i++)
    53         for(j=0;j<n;j++)
    54             cin>>a[i][j];
    55     for(i=0;i<n;i++)
    56         for(j=n;j<2*n;j++)
    57             a[i][j]=0;
    58     for(i=n;i<2*n;i++)
    59         a[i][i-n]=a[i][i]=1;
    60 
    61     a=m_pow(a,k+1);
    62     
    63     for(i=n;i<2*n;i++)
    64     {
    65         for(j=0;j<n;j++)
    66         {
    67             if((i-j)==n)
    68                 a[i][j]--;
    69             if(a[i][j]<0)
    70                 a[i][j]+=m;
    71             cout<<a[i][j]<<" ";
    72         }
    73         cout<<endl;
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    全面分析C#方法中的ref和out
    SQL注入漏洞全接触入门篇
    如何使用四个语句来提高 SQL Server 的伸缩性
    5种提高SQL性能的方法
    SQL注入漏洞全接触高级篇
    网络游戏程序员须知 收包与发包
    SQL注入攻击的原理及其防范措施
    SQL注入漏洞全接触进阶篇
    C#委托的故事
    转眼又快一年了,最近没赚钱,在学习FLASH as3编程
  • 原文地址:https://www.cnblogs.com/a1225234/p/5294848.html
Copyright © 2020-2023  润新知