• <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 閱讀(106) 評論(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国产精品二区不卡| 香蕉久久夜色精品国产尤物| 色诱久久久久综合网ywww| 一97日本道伊人久久综合影院| 精品久久久久久无码不卡| 99精品国产99久久久久久97| 国产精品久久久久jk制服| 国产亚洲精午夜久久久久久 | 中文成人久久久久影院免费观看| 九九久久精品无码专区| 最新久久免费视频| 久久99精品国产麻豆| 欧美久久天天综合香蕉伊| 久久综合亚洲色一区二区三区| 久久香蕉国产线看观看乱码| 久久有码中文字幕| 99麻豆久久久国产精品免费| 国产精品久久久久久久久软件| 亚洲嫩草影院久久精品| 亚洲国产精品无码久久久秋霞2 | 久久精品国产亚洲AV蜜臀色欲| 久久久久久久人妻无码中文字幕爆| 国产精品99久久久久久董美香| 综合人妻久久一区二区精品| 久久久久女教师免费一区| 人妻精品久久无码区| 久久国产一片免费观看| 青青青伊人色综合久久| 久久人人爽人人爽人人片AV不| 亚洲婷婷国产精品电影人久久| 久久99免费视频| 国产精品久久久久久一区二区三区| 一级做a爰片久久毛片免费陪| 精品久久综合1区2区3区激情| 国产一区二区三区久久| 色8久久人人97超碰香蕉987| 亚洲中文字幕久久精品无码APP| 国产精品久久久久久久久久影院| 无码任你躁久久久久久| 亚洲国产精品成人久久蜜臀 | 久久这里的只有是精品23|