早上想寫一些相關的證明,發現自己出了結合律和一些感性認識外,講不出理性的證明。。。
所以只能先給出例題,大家感性的理解一下。。
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 ...