typedeflonglong ll;// 常规快速幂
ll qp(ll a, ll b){
ll ans =1;while(b){if(b &1) ans *= a;
a *= a;
b >>=1;}return ans;}// 模下快速幂
ll qp(ll a, ll b, ll p){
ll ans =1% p;while(b){if(b &1) ans = ans * a % p;
a = a * a % p;
b >>=1;}return ans;}// 乘法快速幂
ll qp(ll a, ll b, ll p){
ll ans =0;while(b){if(b &1) ans =(ans + a)% p;
a = a *2% p;
b >>=1;}return ans;}
二分
boolcheck(int x){/* ... */}// 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:intbsearch_1(int l,int r){while(l < r){int mid = l + r >>1;if(check(mid)) r = mid;// check()判断mid是否满足性质else l = mid +1;}return l;}// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:intbsearch_2(int l,int r){while(l < r){int mid = l + r +1>>1;if(check(mid)) l = mid;else r = mid -1;}return l;}// 实数二分doublebin(double l,double r){double eps =1e-8;while(r - l < eps){double mid =(l + r)/2;if(check(mid)) r = mid;else l = mid;}return r;}
高精度
// C = A + B, A >= 0, B >= 0
vector<int>add(vector<int>&A, vector<int>&B){if(A.size()< B.size())returnadd(B, A);
vector<int> C;int t =0;for(int i =0; i < A.size(); i ++){
t += A[i];if(i < B.size()) t += B[i];
C.push_back(t %10);
t /=10;}if(t) C.push_back(t);return C;}
// C = A - B, 满足A >= B, A >= 0, B >= 0 boolcmp(vi & a, vi & b){if(a.size()!= b.size())return a.size()> b.size();for(int i = a.size()-1; i >=0; i --)if(a[i]!= b[i])return a[i]> b[i];returntrue;}
vector<int>sub(vector<int>&A, vector<int>&B){
vector<int> C;for(int i =0, t =0; i < A.size(); i ++){
t = A[i]- t;if(i < B.size()) t -= B[i];
C.push_back((t +10)%10);if(t <0) t =1;else t =0;}while(C.size()>1&& C.back()==0) C.pop_back();return C;}