矩陣乘法總結

矩陣乘法(logN)

對於一個m行n列的矩陣乘一個n行p列的矩陣,得到一個m行p列的矩陣;
一般用來優化遞推;
Hint: 矩陣不滿足交換律;即A*B != B*A
  矩陣乘法滿足分配律:
   (k+l)A=kA+lA;
   k(A+B)=kA+kB;
   k(lA)=(kl)A;

注意:while(n)是非0即正,要注意判斷是否爲負數;或直接改成while(n>0);  

矩陣加法:
  結果矩陣中的第i行第j列的值,爲A矩陣第i行第j列的值與B矩陣第i行第j列的數值和

  c.m[i][j]=(a.m[i][j]+b.m[i][j])%MOD;

矩陣乘法:
  結果矩陣中的第i行第j列的值,結果爲A矩陣中第i行,與B矩陣中第j列中,每一對應的項的乘積和;

  c.m[i][j]=(c.[i][j]+a.m[i][k]*b.m[k][j])%MOD;

數組複製:memcpy(a,c,sizeof(c));(將c複製給a);

做題記錄:

  1. POJ-3233
  2. Codevs-3332
  3. Voj-1067
    Hint: 對於這種優化遞推的矩陣乘,除了要構造出矩陣外,還要注意初始矩陣的賦值;初始矩陣的值應該先遞推出來;
  4. VOJ-1049
    Hint:坑點很多,可以把每一個置換看成一個矩陣,那麼對於k次變化,把m個置換矩陣乘起來,就得到一個m次變化的總矩陣,把原數列乘(k/m)次,然後再把還沒有變換的k%m變換上就可以了,注意餘數爲0的情況;
  5. BZOJ2326[數學作業]
    Hint 將大數據按log10()優化;
  6. HDU-5171
  7. CodeForces-551D [Gukiz and Binary Operations]

    Hint:這裏需要用到二進制的思想,因爲二進制每一位都是獨立的,所以只需要考慮ai 每一位的情況即可;設f[i][0]爲第i位是0的情況,f[i][1]爲第i位是1的情況,那麼

    {f[i][0]=f[i][1](1)f[i][1]=f[i][0]+f[i][1]

    設dp[i]=f[i][0]+f[i][1];總的方案數,則
    dp[i]=f[i-1][1]+f[i-1][0]+f[i-1][1];
    dp[i]=dp[i-1]+f[i-2][0]+f[i-2][1];
    dp[i]=dp[i-1]+dp[i-2];
    那麼,這個就是Fbi數列;
    因爲二進制位是可以獨立考慮的,那麼放0或者放1的總的方案數就是2n 種,再減去放0的方案數,就是放1的合法方案數;
    放0的方案數就是上面推出來的Fbi數的第n項(因爲從遞推公式可以知道f[n]中一定包含至少含有1個0的情況);
    考慮到乘法原理,那麼把每一項的方案數乘起來就是結果;
  8. HH去散步
    Hint 類似與Floyed,用矩陣來記錄當前所有邊能連接到的邊,然後自乘T次後,如果還聯通就說明從i至j可以經過T次到達;
    這道題類似於這種方法,不過要將點邊互換;

  9. 有意義的字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章