codeforces 718c 矩陣快速冪套線段樹

2021-09-29 01:32:58 字數 2768 閱讀 1217

題意 給出乙個序列ai,定義斐波那契數列,求sigma f(ai)

還有可能令一段ai加上乙個數字。

斐波那契數列可以有矩陣快速冪加速求出,複雜度logn,我們這裡定義mat為加速矩陣,那麼對一段求和便可以寫成sigma mati,對於一段區間加上乙個數字,實際上等同於給每乙個mat在乘上乙個矩陣。

實際上變成維護區間加和的題目,只不過每乙個節點儲存乙個矩陣。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

#include

#define up(i,a,b) for(int i=a;i#define dw(i,a,b) for(int i=a;i>b;i--)

#define upd(i,a,b) for(int i=a;i<=b;i++)

#define dwd(i,a,b) for(int i=a;i>=b;i--)

//#define local

typedef

long

long ll;

const

double esp =

1e-6

;const

double pi =

acos(-

1.0)

;const

int inf =

0x3f3f3f3f

;const

int inf =

1e9;

using

namespace std;

ll read()

while

(ch >=

'0'&& ch <=

'9')

return x * f;

}typedef pair<

int,

int> pir;

#define lson l,mid,root<<1

#define rson mid+1,r,root<<1|1

#define lrt root<<1

#define rrt root<<1|1

const

int n =

1e5+10;

const

int mod =

1e9+7;

struct matrix

void

initfib()

void

one(

) matrix operator+(

const matrix &m)

const

matrix operator*(

const matrix &m)

const

matrix operator^(

const ll &k)

const

return res;

}}tree[n<<2]

,lazy[n<<2]

; matrix isone;

bool

same

(matrix a, matrix b)

void

pushup

(int root)

void

pushdown

(int root)

}void

build

(int l,

int r,

int root)

int mid =

(l + r)

>>1;

build

(lson)

;build

(rson)

;pushup

(root);}

void

update

(int l,

int r,

int root,

int lf,

int rt,matrix x)

pushdown

(root)

;int mid =

(l + r)

>>1;

if(lf <= mid)

update

(lson, lf, rt, x);if

(rt > mid)

update

(rson, lf, rt, x)

;pushup

(root);}

matrix querry

(int l,

int r,

int root,

int lf,

int rt)

pushdown

(root)

;int mid=

(l + r)

>>1;

matrix ans; ans.

init()

;if(lf <= mid)ans = ans +

querry

(lson, lf, rt);if

(rt > mid)ans = ans +

querry

(rson, lf, rt)

;return ans;

}int n, m;

ll a[n]

;int

main()

else

}return0;

}

7 18c 學習筆記

個站尚未通過備案,借csdn住幾天 1.include using namespace std void swap int a,int b 注意對int 的理解,先是int 指標型別,再是引用 錯誤 int a,int b 即使通過指標直接進行修改記憶體,也是臨時形參變數 這裡不是全域性變數的指標 ...

IOS開發之路 C 學習筆記7 18

上節回顧 while 迴圈和do.while 迴圈 的區別?while迴圈 是先判斷後執行,do.while 是先執行一次後判斷.且 do.while 至少迴圈一次.break的作用 跳出switch 語句,跳出與自己最近的一次迴圈 continue的作用 跳出本次迴圈,執行下次迴圈.常量區 不允許...

C語言每日一練7 18

a類 b類2.請編寫乙個程式,使用者輸入乙個十進位制數,將其轉換為二進位制並輸出。3.下列程式的執行結果為 include void func int x int main return 0 以下為答案 1.d 硬碟檔案系統除了fat還有ntfs u盤檔案系統 光碟檔案系統 2.include in...