矩陣快速冪(加法 取min)

2021-10-07 05:48:35 字數 1905 閱讀 4321

早上想寫一些相關的證明,發現自己出了結合律和一些感性認識外,講不出理性的證明。。。

所以只能先給出例題,大家感性的理解一下。。

cf352e

思路:看完題(解 )之後,可以得到乙個推論:放完i個括號之後,最多不會超過2n個左括號未匹配。

那麼,先預處理出從i個未匹配的左括號放n個括號之後轉移到j個未匹配的左括號需要的 最小花費,然後直接做冪次為m的矩陣快速冪即可。

#include

using

namespace std;

typedef

long

long ll;

const

int n =

2e5+10;

#define fi first

#define se second

#define pb push_back

int n,m,a[n]

,b[n]

;int dp[22]

[44];

struct uzi

;}g;

uzi operator*(

const uzi & a,

const uzi & b)}}

return c;

}uzi pm()

return c;

}int

main()

for(

int i=

0;i)for

(int i=

0;i<=

40;i++

)else

if(k+

1<=40)

}}for(

int k=

0;k<=

40;k++)}

} cout<).a[0]

[0];

return0;

}

namomo test round 1 c.polygon

思路:從當前六邊形到下乙個六邊形顯然只能通過1,2號節點,那麼總共就有2個位置,每個位置2個方向,共四種狀態。那麼先手推出四種狀態互相轉移的最小花費。然後剩下的就跟上面的題一樣了。還有一些別的細節自己需要注意一下即可。

#include

using

namespace std;

typedef

long

long ll;

const

int n =

2e5+10;

#define fi first

#define se second

#define pb push_back

int t;

ll x,y,k,l;

int dx[6]

[4]=

,,,,

,};int dy[4]

[6]=

,,,}

;int a[4]

[4]=

,,,}

;struct uzi}}

};uzi operator*(

const uzi a,

const uzi b)}}

return c;

}uzi pm

(ll pw)

}while

(pw)

return ans;

}int

main()

if(x==k)

else

for(

int i=

0;i<

4;i++

) cout<'\n'

;continue;}

for(

int i=

0;i<

4;i++)}

cout<'\n';}

}return0;

}

快速冪 快速冪矩陣 快速冪取模

快速冪可以通過算式化簡來有效的減少計算量 例如8 5,如果不採用任何化簡方式,則是8 8 8 8 8 快速冪思想就是將指數進行分解,從而減少計算次數,參照的是二級制下的指數分離思想 對於5,可以化為101二級制串,所以5 2 0 2 2 所以8 5 8 1 8 4,從而有效地從五次計算化為了兩次計算...

快速冪(矩陣快速冪)

求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...