青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

The Fourth Dimension Space

枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

十個利用矩陣乘法解決的經(jīng)典題目(matrix67)

好像目前還沒有這方面題目的總結(jié)。這幾天連續(xù)看到四個問這類題目的人,今天在這里簡單寫一下。這里我們不介紹其它有關(guān)矩陣的知識,只介紹矩陣乘法和相關(guān)性質(zhì)。
    不要以為數(shù)學(xué)中的矩陣也是黑色屏幕上不斷變化的綠色字符。在數(shù)學(xué)中,一個矩陣說穿了就是一個二維數(shù)組。一個n行m列的矩陣可以乘以一個m行p列的矩陣,得到的結(jié)果是一個n行p列的矩陣,其中的第i行第j列位置上的數(shù)等于前一個矩陣第i行上的m個數(shù)與后一個矩陣第j列上的m個數(shù)對應(yīng)相乘后所有m個乘積的和。比如,下面的算式表示一個2行2列的矩陣乘以2行3列的矩陣,其結(jié)果是一個2行3列的矩陣。其中,結(jié)果的那個4等于2*2+0*1:
    
    下面的算式則是一個1 x 3的矩陣乘以3 x 2的矩陣,得到一個1 x 2的矩陣:
    

    矩陣乘法的兩個重要性質(zhì):一,矩陣乘法不滿足交換律;二,矩陣乘法滿足結(jié)合律。為什么矩陣乘法不滿足交換律呢?廢話,交換過來后兩個矩陣有可能根本不能相乘。為什么它又滿足結(jié)合律呢?仔細想想你會發(fā)現(xiàn)這也是廢話。假設(shè)你有三個矩陣A、B、C,那么(AB)C和A(BC)的結(jié)果的第i行第j列上的數(shù)都等于所有A(ik)*B(kl)*C(lj)的和(枚舉所有的k和l)。

經(jīng)典題目1 給定n個點,m個操作,構(gòu)造O(m+n)的算法輸出m個操作后各點的位置。操作有平移、縮放、翻轉(zhuǎn)和旋轉(zhuǎn)
    這里的操作是對所有點同時進行的。其中翻轉(zhuǎn)是以坐標軸為對稱軸進行翻轉(zhuǎn)(兩種情況),旋轉(zhuǎn)則以原點為中心。如果對每個點分別進行模擬,那么m個操作總共耗時O(mn)。利用矩陣乘法可以在O(m)的時間里把所有操作合并為一個矩陣,然后每個點與該矩陣相乘即可直接得出最終該點的位置,總共耗時O(m+n)。假設(shè)初始時某個點的坐標為x和y,下面5個矩陣可以分別對其進行平移、旋轉(zhuǎn)、翻轉(zhuǎn)和旋轉(zhuǎn)操作。預(yù)先把所有m個操作所對應(yīng)的矩陣全部乘起來,再乘以(x,y,1),即可一步得出最終點的位置。
    

經(jīng)典題目2 給定矩陣A,請快速計算出A^n(n個A相乘)的結(jié)果,輸出的每個數(shù)都mod p。
    由于矩陣乘法具有結(jié)合律,因此A^4 = A * A * A * A = (A*A) * (A*A) = A^2 * A^2。我們可以得到這樣的結(jié)論:當n為偶數(shù)時,A^n = A^(n/2) * A^(n/2);當n為奇數(shù)時,A^n = A^(n/2) * A^(n/2) * A (其中n/2取整)。這就告訴我們,計算A^n也可以使用二分快速求冪的方法。例如,為了算出A^25的值,我們只需要遞歸地計算出A^12、A^6、A^3的值即可。根據(jù)這里的一些結(jié)果,我們可以在計算過程中不斷取模,避免高精度運算。

經(jīng)典題目3 POJ3233 (感謝rmq)
    題目大意:給定矩陣A,求A + A^2 + A^3 + ... + A^k的結(jié)果(兩個矩陣相加就是對應(yīng)位置分別相加)。輸出的數(shù)據(jù)mod m。k<=10^9。
    這道題兩次二分,相當經(jīng)典。首先我們知道,A^i可以二分求出。然后我們需要對整個題目的數(shù)據(jù)規(guī)模k進行二分。比如,當k=6時,有:
    A + A^2 + A^3 + A^4 + A^5 + A^6 =(A + A^2 + A^3) + A^3*(A + A^2 + A^3)
    應(yīng)用這個式子后,規(guī)模k減小了一半。我們二分求出A^3后再遞歸地計算A + A^2 + A^3,即可得到原問題的答案。

經(jīng)典題目4 VOJ1049
    題目大意:順次給出m個置換,反復(fù)使用這m個置換對初始序列進行操作,問k次置換后的序列。m<=10, k<2^31。
    首先將這m個置換“合并”起來(算出這m個置換的乘積),然后接下來我們需要執(zhí)行這個置換k/m次(取整,若有余數(shù)則剩下幾步模擬即可)。注意任意一個置換都可以表示成矩陣的形式。例如,將1 2 3 4置換為3 1 2 4,相當于下面的矩陣乘法:
    
    置換k/m次就相當于在前面乘以k/m個這樣的矩陣。我們可以二分計算出該矩陣的k/m次方,再乘以初始序列即可。做出來了別忙著高興,得意之時就是你滅亡之日,別忘了最后可能還有幾個置換需要模擬。

經(jīng)典題目5 《算法藝術(shù)與信息學(xué)競賽》207頁(2.1代數(shù)方法和模型,[例題5]細菌,版次不同可能頁碼有偏差)
    大家自己去看看吧,書上講得很詳細。解題方法和上一題類似,都是用矩陣來表示操作,然后二分求最終狀態(tài)。

經(jīng)典題目6 給定n和p,求第n個Fibonacci數(shù)mod p的值,n不超過2^31
    根據(jù)前面的一些思路,現(xiàn)在我們需要構(gòu)造一個2 x 2的矩陣,使得它乘以(a,b)得到的結(jié)果是(b,a+b)。每多乘一次這個矩陣,這兩個數(shù)就會多迭代一次。那么,我們把這個2 x 2的矩陣自乘n次,再乘以(0,1)就可以得到第n個Fibonacci數(shù)了。不用多想,這個2 x 2的矩陣很容易構(gòu)造出來:
    

經(jīng)典題目7 VOJ1067
    我們可以用上面的方法二分求出任何一個線性遞推式的第n項,其對應(yīng)矩陣的構(gòu)造方法為:在右上角的(n-1)*(n-1)的小矩陣中的主對角線上填1,矩陣第n行填對應(yīng)的系數(shù),其它地方都填0。例如,我們可以用下面的矩陣乘法來二分計算f(n) = 4f(n-1) - 3f(n-2) + 2f(n-4)的第k項:
    
    利用矩陣乘法求解線性遞推關(guān)系的題目我能編出一卡車來。這里給出的例題是系數(shù)全為1的情況。

經(jīng)典題目8 給定一個有向圖,問從A點恰好走k步(允許重復(fù)經(jīng)過邊)到達B點的方案數(shù)mod p的值
    把給定的圖轉(zhuǎn)為鄰接矩陣,即A(i,j)=1當且僅當存在一條邊i->j。令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),實際上就等于從點i到點j恰好經(jīng)過2條邊的路徑數(shù)(枚舉k為中轉(zhuǎn)點)。類似地,C*A的第i行第j列就表示從i到j(luò)經(jīng)過3條邊的路徑數(shù)。同理,如果要求經(jīng)過k步的路徑數(shù),我們只需要二分求出A^k即可。

經(jīng)典題目9 用1 x 2的多米諾骨牌填滿M x N的矩形有多少種方案,M<=5,N<2^31,輸出答案mod p的結(jié)果
    
    我們以M=3為例進行講解。假設(shè)我們把這個矩形橫著放在電腦屏幕上,從右往左一列一列地進行填充。其中前n-2列已經(jīng)填滿了,第n-1列參差不齊?,F(xiàn)在我們要做的事情是把第n-1列也填滿,將狀態(tài)轉(zhuǎn)移到第n列上去。由于第n-1列的狀態(tài)不一樣(有8種不同的狀態(tài)),因此我們需要分情況進行討論。在圖中,我把轉(zhuǎn)移前8種不同的狀態(tài)放在左邊,轉(zhuǎn)移后8種不同的狀態(tài)放在右邊,左邊的某種狀態(tài)可以轉(zhuǎn)移到右邊的某種狀態(tài)就在它們之間連一根線。注意為了保證方案不重復(fù),狀態(tài)轉(zhuǎn)移時我們不允許在第n-1列豎著放一個多米諾骨牌(例如左邊第2種狀態(tài)不能轉(zhuǎn)移到右邊第4種狀態(tài)),否則這將與另一種轉(zhuǎn)移前的狀態(tài)重復(fù)。把這8種狀態(tài)的轉(zhuǎn)移關(guān)系畫成一個有向圖,那么問題就變成了這樣:從狀態(tài)111出發(fā),恰好經(jīng)過n步回到這個狀態(tài)有多少種方案。比如,n=2時有3種方案,111->011->111、111->110->111和111->000->111,這與用多米諾骨牌覆蓋3x2矩形的方案一一對應(yīng)。這樣這個題目就轉(zhuǎn)化為了我們前面的例題8。
    后面我寫了一份此題的源代碼。你可以再次看到位運算的相關(guān)應(yīng)用。

經(jīng)典題目10 POJ2778
    題目大意是,檢測所有可能的n位DNA串有多少個DNA串中不含有指定的病毒片段。合法的DNA只能由ACTG四個字符構(gòu)成。題目將給出10個以內(nèi)的病毒片段,每個片段長度不超過10。數(shù)據(jù)規(guī)模n<=2 000 000 000。
    下面的講解中我們以ATC,AAA,GGC,CT這四個病毒片段為例,說明怎樣像上面的題一樣通過構(gòu)圖將問題轉(zhuǎn)化為例題8。我們找出所有病毒片段的前綴,把n位DNA分為以下7類:以AT結(jié)尾、以AA結(jié)尾、以GG結(jié)尾、以?A結(jié)尾、以?G結(jié)尾、以?C結(jié)尾和以??結(jié)尾。其中問號表示“其它情況”,它可以是任一字母,只要這個字母不會讓它所在的串成為某個病毒的前綴。顯然,這些分類是全集的一個劃分(交集為空,并集為全集)?,F(xiàn)在,假如我們已經(jīng)知道了長度為n-1的各類DNA中符合要求的DNA個數(shù),我們需要求出長度為n時各類DNA的個數(shù)。我們可以根據(jù)各類型間的轉(zhuǎn)移構(gòu)造一個邊上帶權(quán)的有向圖。例如,從AT不能轉(zhuǎn)移到AA,從AT轉(zhuǎn)移到??有4種方法(后面加任一字母),從?A轉(zhuǎn)移到AA有1種方案(后面加個A),從?A轉(zhuǎn)移到??有2種方案(后面加G或C),從GG到??有2種方案(后面加C將構(gòu)成病毒片段,不合法,只能加A和T)等等。這個圖的構(gòu)造過程類似于用有限狀態(tài)自動機做串匹配。然后,我們就把這個圖轉(zhuǎn)化成矩陣,讓這個矩陣自乘n次即可。最后輸出的是從??狀態(tài)到所有其它狀態(tài)的路徑數(shù)總和。
    題目中的數(shù)據(jù)規(guī)模保證前綴數(shù)不超過100,一次矩陣乘法是三方的,一共要乘log(n)次。因此這題總的復(fù)雜度是100^3 * log(n),AC了。

    最后給出第9題的代碼供大家參考(今天寫的,熟悉了一下C++的類和運算符重載)。為了避免大家看代碼看著看著就忘了,我把這句話放在前面來說:
    Matrix67原創(chuàng),轉(zhuǎn)貼請注明出處。

#include <cstdio>
#define SIZE (1<<m)
#define MAX_SIZE 32
using namespace std;

class CMatrix
{
    public:
        long element[MAX_SIZE][MAX_SIZE];
        void setSize(int);
        void setModulo(int);
        CMatrix operator* (CMatrix);
        CMatrix power(int);
    private:
        int size;
        long modulo;
};

void CMatrix::setSize(int a)
{
    for (int i=0; i<a; i++)
        for (int j=0; j<a; j++)
            element[i][j]=0;
    size = a;
}

void CMatrix::setModulo(int a)
{
    modulo = a;
}

CMatrix CMatrix::operator* (CMatrix param)
{
    CMatrix product;
    product.setSize(size);
    product.setModulo(modulo);
    for (int i=0; i<size; i++)
        for (int j=0; j<size; j++)
            for (int k=0; k<size; k++)
            {
                product.element[i][j]+=element[i][k]*param.element[k][j];
                product.element[i][j]%=modulo;
            }

    return product;
}

CMatrix CMatrix::power(int exp)
{
    CMatrix tmp = (*this) * (*this);
    if (exp==1) return *this;
    else if (exp & 1) return tmp.power(exp/2) * (*this);
    else return tmp.power(exp/2);
}


int main()
{
    const int validSet[]={0,3,6,12,15,24,27,30};
    long n, m, p;
    CMatrix unit;
    
    scanf("%d%d%d", &n, &m, &p);
    unit.setSize(SIZE);
    for(int i=0; i<SIZE; i++)
        for(int j=0; j<SIZE; j++)
            if( ((~i)&j) == ((~i)&(SIZE-1)) )
            {
                bool isValid=false;
                for (int k=0; k<8; k++)isValid=isValid||(i&j)==validSet[k];
                unit.element[i][j]=isValid;
            }

    unit.setModulo(p);
    printf("%d", unit.power(n).element[SIZE-1][SIZE-1] );
    return 0;
}


源地址:http://www.matrix67.com/blog/?s=%E5%8D%81%E4%B8%AA%E5%88%A9%E7%94%A8%E7%9F%A9%E9%98%B5%E4%B9%98%E6%B3%95%E8%A7%A3%E5%86%B3%E7%9A%84%E7%BB%8F%E5%85%B8%E9%A2%98%E7%9B%AE

posted on 2010-04-18 16:46 abilitytao 閱讀(685) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美久久99| 国产精品久久久久久久久久久久| 国产一区二区三区网站| 欧美一二三区精品| 午夜精品久久久久久久白皮肤| 国产乱码精品一区二区三区五月婷 | 亚洲精品一二区| 亚洲人成精品久久久久| 欧美精品性视频| 亚洲午夜久久久| 午夜精品久久久久久久| 一区在线免费观看| 91久久在线观看| 欧美性开放视频| 久久精视频免费在线久久完整在线看| 久久久久久久久久久久久女国产乱 | 日韩亚洲欧美一区| 99riav久久精品riav| 国产精品一区二区a| 久久久亚洲综合| 欧美激情a∨在线视频播放| 亚洲天堂网站在线观看视频| 欧美一区二粉嫩精品国产一线天| 一区二区三区自拍| 亚洲毛片av| 黑人极品videos精品欧美裸| 亚洲精品乱码久久久久久日本蜜臀| 国产精品视频午夜| 亚洲电影网站| 国产亚洲美州欧州综合国| 亚洲二区视频在线| 国产精品影视天天线| 亚洲韩日在线| 国内自拍亚洲| 亚洲深夜影院| 亚洲精品欧美在线| 欧美一区二区性| 亚洲视频视频在线| 老司机一区二区三区| 性做久久久久久久久| 欧美激情一区三区| 久久阴道视频| 国产精品一区视频| 亚洲国产91精品在线观看| 国产欧美日韩另类视频免费观看| 亚洲人成网站精品片在线观看| 狠狠干综合网| 欧美一级播放| 亚洲欧美日韩综合| 欧美精品一区二区三区在线看午夜 | 亚洲在线免费| 欧美激情综合五月色丁香| 久久理论片午夜琪琪电影网| 国产精品普通话对白| 一本到高清视频免费精品| 亚洲人成在线观看一区二区| 久久麻豆一区二区| 久久精品91| 国产精品日韩在线观看| 日韩一级大片| 一区二区三区四区蜜桃| 欧美精品久久久久久久| 亚洲国产精品嫩草影院| 亚洲国产天堂久久综合网| 久久国产乱子精品免费女| 久久成人综合网| 国产日本欧美视频| 亚洲欧美日韩国产另类专区| 亚洲男人影院| 国产麻豆综合| 欧美一区二区三区啪啪| 久久亚洲美女| 雨宫琴音一区二区在线| 久久亚洲精品伦理| 欧美成人一区二区三区片免费| 在线观看欧美| 欧美大片一区| 夜夜嗨av一区二区三区中文字幕| 亚洲一区二区伦理| 国产精品久久二区| 亚洲综合成人在线| 久久久久综合| 亚洲国产精品久久91精品| 欧美激情aaaa| 国产精品99久久久久久久女警| 欧美一区二区三区免费在线看 | 久久字幕精品一区| 亚洲夫妻自拍| 亚洲性视频h| 国产日韩精品一区二区三区| 久久aⅴ国产欧美74aaa| 欧美黑人多人双交| 一本色道久久88亚洲综合88| 国产精品久久午夜| 欧美一区二区三区婷婷月色 | 久久这里有精品15一区二区三区| 欧美激情中文字幕在线| 亚洲视频欧洲视频| 国产亚洲成人一区| 免费精品视频| 亚洲午夜精品久久| 久久躁狠狠躁夜夜爽| 99精品国产在热久久下载| 国产精品爽黄69| 麻豆精品传媒视频| 亚洲深夜福利| 欧美激情视频一区二区三区免费 | 一本色道久久| 欧美成人亚洲| 午夜免费电影一区在线观看| 亚洲国产成人av| 国产精品试看| 欧美激情亚洲精品| 欧美伊久线香蕉线新在线| 亚洲精品自在久久| 久久亚洲欧美| 欧美一区不卡| 亚洲视频一二| 亚洲精品国产精品久久清纯直播| 国产精品一区二区男女羞羞无遮挡 | 欧美三级在线播放| 久久久久国产精品厨房| 一区二区三区视频在线观看| 欧美国产一区二区在线观看| 欧美在线日韩精品| 一本久久综合亚洲鲁鲁五月天| 在线不卡欧美| 国模 一区 二区 三区| 国产精品日本欧美一区二区三区| 欧美二区视频| 久久中文字幕一区| 欧美中文字幕视频在线观看| 亚洲综合色激情五月| 一本色道久久综合一区 | 久热综合在线亚洲精品| 亚洲欧美国产高清va在线播| 中文一区二区在线观看| 亚洲日本成人网| 亚洲第一在线| 一区二区三区无毛| 影音先锋久久资源网| 在线观看av一区| 在线精品亚洲| 亚洲成人在线观看视频| 1204国产成人精品视频| 极品中文字幕一区| 伊伊综合在线| 91久久精品视频| 99视频有精品| 亚洲中无吗在线| 小黄鸭精品密入口导航| 久久精品人人爽| 久久久午夜电影| 欧美成人dvd在线视频| 欧美激情视频网站| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲免费高清| 一区二区免费在线观看| 亚洲综合色在线| 新狼窝色av性久久久久久| 久久成人精品视频| 久久久蜜桃一区二区人| 欧美激情视频一区二区三区在线播放 | 美女尤物久久精品| 欧美成人精品影院| 欧美日韩国产专区| 国产精品久久久久久久久免费 | 亚洲在线观看视频| 午夜欧美大片免费观看| 久久久精品国产免大香伊| 免费视频一区| 亚洲精品在线免费观看视频| 亚洲午夜激情网页| 久久手机精品视频| 欧美日韩午夜剧场| 国产在线观看91精品一区| 91久久视频| 性欧美8khd高清极品| 免费美女久久99| 这里只有精品丝袜| 久久综合国产精品台湾中文娱乐网 | 欧美成人午夜激情在线| 99视频一区二区| 亚洲欧美日韩精品久久| 免费日韩视频| 国产精品日韩在线播放| 亚洲国产成人av好男人在线观看| 亚洲在线观看免费| 欧美不卡视频一区发布| 亚洲视频一区二区在线观看| 久久久免费观看视频| 国产精品久久99| 亚洲精品网站在线播放gif| 久久久999精品| 亚洲免费观看高清完整版在线观看| 久久国产黑丝| 欧美午夜精品久久久久久久| 亚洲黄色免费| 久久久另类综合| 亚洲一区免费观看|