• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            poj3233

            Matrix Power Series

            Time Limit: 3000MS
            Memory Limit: 131072K
            Total Submissions: 10211
            Accepted: 4333

            Description

            Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

            Input

            The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

            Output

            Output the elements of S modulo m in the same way as A is given.

            Sample Input

            2 2 4
            0 1
            1 1

            Sample Output

            1 2
            2 3
             
            題意很簡單不用描述了
            網上在推薦這題的時候可能有些誤區
            網上說是二分再二分,
            其實是這樣的,因為計算a^k可以二分,這是第二個二分
            而第一個二分是指的對a^1+a^2+....+a^k可以分成兩半  
            k是偶數時候
            f[k]=(a^1+a^2+....+a^(k/2))+a^(k/2)*[a^1+a^2+....+a^(k/2)]
            即 f[k]=f[k/2]+[a^(k/2)]*f[k/2]
            奇數時候 
            f[k]=f[k-1]+a^k
            以上描述的兩次二分是第一種做法
            第二種做法
            運用線性代數的
            令B= A E
                 0 E
            那么
            B^(k+1)= A^(k+1)  E+A+...A^k
                     0        E
             
            然后就不用多說了
             
            剛開始想出第一種方法,覺著也不難寫 ,
            然后wa到死 tle到死
            一直超時,那個取模那個如果不取就wa,取了就tle,真心糾結了
            然后忍不了了
            寫的第二個
            不知道為什么還是那么長時間
            應該是我寫的代碼質量不好
            #include<stdio.h>
            #include
            <string.h>
            #include
            <math.h>
            #include
            <iostream>
            #define maxn 35*2
            using namespace std;
            struct node
            {
                __int64 x[maxn][maxn];
                
            void init()
                
            {
                    memset(x,
            0,sizeof(x));
                }

                
            void init1()
                
            {
                    memset(x,
            0,sizeof(x));
                    
            for(int i=1; i<maxn; i++)
                        x[i][i]
            =1;
                }

            }
            ;
            node e;
            int m,n,k;
            void print1(node x)
            {
                
            for(int i=1; i<=n; i++)
                
            {
                    
            for(int j=1+n; j<=2*n; j++)
                    
            {
                        printf(
            "%d",x.x[i][j]);
                        
            if(j==n*2) printf("\n");
                        
            else printf(" ");
                    }

                }

            }

            node add1(node x)
            {
                node tmp;
                tmp
            =x;
                
            for(int i=1;i<=n;i++)
                
            {
                    
            for(int j=n+1;j<=2*n;j++)
                        tmp.x[i][j]
            =(tmp.x[i][j]%m+m)%m;
                }

                
            for(int i=1; i<=n; i++
                tmp.x[i][i
            +n]=(tmp.x[i][i+n]-1+m)%m;
                
            return tmp;
            }

            node mul(node t1,node t2)
            {
                node tmp;
                tmp.init();
                
            for(int i=1; i<=2*n; i++)
                    
            for(int j=1; j<=2*n; j++)
                    
            {
                        tmp.x[i][j]
            =0;
                        
            for(int k=1; k<=2*n; k++)
                        
            {
                            tmp.x[i][j]
            =(tmp.x[i][j]+t1.x[i][k]*t2.x[k][j])%m;
                        }

                    }

                
            return tmp;
            }

            node ap(node a,
            int p)
            {
                
            int tmp;
                node x,ans;
                tmp
            =p;
                ans.init1();
                x
            =a;
                
            while(tmp)
                
            {
                    
            if(tmp%2==1) ans=mul(ans,x);
                    tmp
            =tmp/2;
                    x
            =mul(x,x);
                }

                
            return ans;
            }

            int main()
            {
                node a,ans,b;
                scanf(
            "%d%d%d",&n,&k,&m);
                a.init();
                
            for(int i=1; i<=n; i++)
                    
            for(int j=1; j<=n; j++)
                    
            {
                        scanf(
            "%d",&a.x[i][j]);
                        a.x[i][j]
            =a.x[i][j]%m;
                    }

                b
            =a;
                
            for(int j=1; j<=n; j++)
                
            {
                    b.x[j][j
            +n]=1;
                    b.x[j
            +n][j+n]=1;
                }

                ans
            =ap(b,k+1);
                ans
            =add1(ans);
                print1(ans);
                
            return 0;
            }



            那個第一種方法tle,待會去優化下代碼,應該能過



            呼,第一種方法終于過了

            #include<stdio.h>
            #include
            <string.h>
            #include
            <math.h>
            #include
            <iostream>
            #define maxn 35
            #define inf 0x7fffffff
            using namespace std;
            struct node
            {
                __int64 x[maxn][maxn];
                
            void init()
                {
                    memset(x,
            0,sizeof(x));
                }
                
            void init1()
                {
                    memset(x,
            0,sizeof(x));
                    
            for(int i=1; i<maxn; i++)
                        x[i][i]
            =1;
                }
            };
            node e;
            int m,n,k;
            void print(node x)
            {
                
            for(int i=1; i<=n; i++)
                {
                    
            for(int j=1; j<=n; j++)
                    {
                        printf(
            "%d",x.x[i][j]);
                        
            if(j==n) printf("\n");
                        
            else printf(" ");
                    }
                }
            }
            node add(node t1,node t2)
            {
                node tmp;
                
            for(int i=1; i<=n; i++)
                    
            for(int j=1; j<=n; j++)
                    {
                        tmp.x[i][j]
            =(t1.x[i][j]+t2.x[i][j])%m;
                    }
                
            return tmp;
            }
            node mul(node t1,node t2)
            {
                node tmp;
                tmp.init();
                
            for(int i=1; i<=n; i++)
                    
            for(int j=1; j<=n; j++)
                    {
                        tmp.x[i][j]
            =0;
                        
            for(int k=1; k<=n; k++)
                        {
                            tmp.x[i][j]
            =(tmp.x[i][j]+t1.x[i][k]*t2.x[k][j]);
                            
            if(tmp.x[i][j]>=inf)
                            {
                                tmp.x[i][j]
            =tmp.x[i][j]%m;
                            }
                        }
                        tmp.x[i][j]
            =(tmp.x[i][j])%m;
                    }
                
            return tmp;
            }
            node ap(node a,
            int p)
            {
                
            int tmp;
                node x,ans;
                tmp
            =p;
                ans.init1();
                x
            =a;
                
            while(tmp)
                {
                    
            if(tmp%2==1) ans=mul(x,ans);
                    tmp
            =tmp/2;
                    x
            =mul(x,x);
                }
                
            return ans;
            }
            node getsum(node x,
            int n)
            {
                
            int k;
                node ans,tmp;
                k
            =n;
                
            if(k==1return x;
                
            if (k%2==0)
                {
                    tmp
            =getsum(x,k/2);
                    ans
            =add(tmp,mul(ap(x,k/2),tmp));
                }
                
            else
                {
                    tmp
            =getsum(x,k/2);
                    ans
            =add(add(tmp,mul(ap(x,k/2),tmp)),ap(x,k));
                }
                
            return ans;
            }
            int main()
            {
                node a,ans,b;
                scanf(
            "%d%d%d",&n,&k,&m);
                a.init();
                
            for(int i=1; i<=n; i++)
                    
            for(int j=1; j<=n; j++)
                    {
                        scanf(
            "%d",&a.x[i][j]);
                        a.x[i][j]
            =a.x[i][j]%m;
                    }
                ans
            =getsum(a,k);
                print(ans);
                
            return 0;
            }



            posted on 2012-07-22 07:02 jh818012 閱讀(107) 評論(0)  編輯 收藏 引用

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            導航

            統計

            常用鏈接

            留言簿

            文章檔案(85)

            搜索

            最新評論

            • 1.?re: poj1426
            • 我嚓,,輝哥,,居然搜到你的題解了
            • --season
            • 2.?re: poj3083
            • @王私江
              (8+i)&3 相當于是 取余3的意思 因為 3 的 二進制是 000011 和(8+i)
            • --游客
            • 3.?re: poj3414[未登錄]
            • @王私江
              0ms
            • --jh818012
            • 4.?re: poj3414
            • 200+行,跑了多少ms呢?我的130+行哦,你菜啦,哈哈。
            • --王私江
            • 5.?re: poj1426
            • 評論內容較長,點擊標題查看
            • --王私江
            国内精品久久久久久99蜜桃| 青青草原精品99久久精品66| 久久久久亚洲AV无码专区体验| 久久国语露脸国产精品电影 | 粉嫩小泬无遮挡久久久久久| 97热久久免费频精品99| 一本一道久久精品综合| 久久经典免费视频| 国产精品久久久久久影院| 久久久久久一区国产精品| 亚洲精品无码专区久久久| 国产亚洲精久久久久久无码AV| 国产精品久久久久久久久久影院| 精品999久久久久久中文字幕| 亚洲国产高清精品线久久| 久久99热只有频精品8| 久久久噜噜噜久久| 好久久免费视频高清| 久久人与动人物a级毛片| 国产激情久久久久影院| 婷婷久久香蕉五月综合加勒比 | 久久久久女人精品毛片| 久久九九免费高清视频| 久久九九全国免费| 亚洲AV无一区二区三区久久| 精品久久久久久99人妻| 亚洲综合精品香蕉久久网97| 久久亚洲国产成人精品性色| 久久精品国产亚洲AV香蕉| 久久99精品免费一区二区| 99久久免费国产特黄| 久久夜色精品国产欧美乱| 精品综合久久久久久97| 亚洲国产婷婷香蕉久久久久久 | 久久99国产综合精品| 久久人人添人人爽添人人片牛牛| 国产香蕉久久精品综合网| 亚洲欧美一区二区三区久久| 国产精品成人无码久久久久久| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 思思久久99热只有频精品66|