[矩陣快速冪] hdu 5015 233 Matrix

來源:互聯網
上載者:User

標籤:io   os   for   sp   代碼   c   amp   size   r   

之前各種犯傻 推了好久這個東西。。

後來靈關一閃  就搞定了。。

矩陣的題目,就是構造矩陣比較難想!

題意:給出一個矩陣的第一列和第一行(下標從0開始),(0,0)位置為0,

第一行為,233,2333,23333...一次加個3,

第一列為輸入的n個數。

然後從(1,1)位置開始,等於上面的數加左邊的數,問(n+1,m+1)的數是多少,也就是右下角的數

思路:

把矩陣畫出來:

|   0     233   2333  |

|  b0     b1     b2     |

|  c0     c1     c2      |   

|  d0     d1     d2     |

b1=233+b0,c1=b1+c0=233+b0+c0, d1=c1+d0=233+b0+c0+d0。

那麼我們不妨設233為a0,a1=a0*10+3

這樣每一項就都是由前面的項的得到了,因為有個常數3,所以再設一個常數1

那麼我們就可以構造一個這樣的矩陣

                                             |   1    3     0    0    0   |

                                             |   0   10   1    1     1   |

|  1  233  b0  c0 d0  |   *    |   0    0     1    1    1   |     =   |  1   2333  b1  c1  d1  |  

                                             |   0    0     0    1    1   |

                                             |   0    0     0    0    1   |

這樣就是遞推下去,前面的乘上後面矩陣的m次方,輸出ans.mat[0][n+1]  就ok了!

代碼:

#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"stack"#include"algorithm"#include"iostream"using namespace std;int m=10000007;struct matrix{    __int64 mat[15][15];};matrix matmul(matrix a,matrix b,int n,int m)  //矩陣乘法    n階矩陣a、b相乘對m模數{    int i,j,k;    matrix c;    memset(c.mat,0,sizeof(c.mat));    for(i=0;i<n;i++)    {        for(j=0;j<n;j++)        {            for(k=0;k<n;k++)            {                c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];                c.mat[i][j]%=m;            }        }    }    return c;}matrix matpow(matrix a,int k,int n,int m)  //矩陣快速冪模數  n階矩陣a的k次方對m模數{    matrix b;    int i;    memset(b.mat,0,sizeof(b.mat));    for(i=0;i<n;i++) b.mat[i][i]=1;    while(k)    {        if(k&1) b=matmul(a,b,n,m);        a=matmul(a,a,n,m);        k>>=1;    }    return b;}int main(){    int n,k;    while(scanf("%d%d",&n,&k)!=-1)    {        int i,j;        matrix a,b,ans;        memset(a.mat,0,sizeof(a.mat));        memset(b.mat,0,sizeof(b.mat));        for(i=0;i<n;i++) scanf("%I64d",&a.mat[0][i+2]);        a.mat[0][0]=1;        a.mat[0][1]=233;        b.mat[0][0]=1;        b.mat[0][1]=3;        b.mat[1][1]=10;        for(i=2;i<=n+1;i++)        {            for(j=1;j<1+i;j++)                b.mat[j][i]=1;        }        ans=matmul(a,matpow(b,k,n+2,m),n+2,m);        printf("%I64d\n",ans.mat[0][n+1]);    }    return 0;}



[矩陣快速冪] hdu 5015 233 Matrix

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.