upc 卡德加的兔子 線段樹 矩陣快速冪

2021-10-05 18:14:27 字數 4533 閱讀 3760

卡德加的兔子

時間限制: 5 sec 記憶體限制: 128 mb

題目描述

卡德加喜歡養兔⼦。他在達拉然的下⽔道⾥放了n個兔籠(編號1到n),⾥⾯養著他從德拉諾帶來的兔⼦。它們的繁殖遵循斐波那契數列的規律:剛開始時,籠⼦⾥有⼀對剛出⽣的兔⼦。每對兔⼦在出⽣第⼆個⽉後,每個⽉都⽣⼀對兔⼦。(第⼀個⽉結束後有1對兔⼦。第⼆個⽉結束後有2對。)

卡德加從蘇拉瑪的⼤魔導⼠艾利桑德那邊學習了先進的扭曲時空法術。

有時候,他會對⼀排連續的兔籠(從第l號到第r號)釋放時光流逝法術,讓這些兔籠⾥的時間前進k個⽉。另外⼀些時候,他想喂⼀下兔⼦,所以他想知道第l號到第r號兔籠⾥有多少只兔⼦。

(假設這些操作都是在⼀個⽉以內完成的,不需要考慮⾃然時間對兔⼦的影響。)

輸入第⼀⾏兩個整數n;m,表⽰兔籠的數量和操作的數量。

接下來m⾏,每⾏包含三個數l;r;k。如果k>0,說明卡德加在使⽤時光流逝,編號l到r的兔籠時間前進k個⽉。如果k=0,說明他只是想喂兔⼦了,輸出這些兔籠⾥有多少兔⼦。

輸出對每個喂兔⼦的操作,輸出兔⼦的數量。答案模10007。

樣例輸入 copy

100 100

26 85 0

2 81 1

67 69 0

22 69 2

27 80 0

79 87 2

57 63 2

76 80 3

95 99 4

45 94 2

27 75 1

22 75 0

12 51 2

25 66 2

11 61 1

83 88 0

27 83 1

14 97 1

71 90 3

10 44 4

73 93 4

1 98 4

23 93 3

56 76 3

13 25 2

57 68 1

18 28 3

19 28 0

21 78 4

10 95 3

93 98 4

73 81 0

28 44 0

20 53 0

59 75 4

53 69 2

9 54 1

55 95 4

14 46 4

22 50 2

35 98 3

34 93 4

91 92 4

43 53 2

45 64 2

58 87 4

64 74 3

36 62 4

16 98 0

71 76 3

39 99 1

6 16 3

12 73 2

37 82 4

56 92 1

81 99 0

9 51 3

27 80 4

13 60 3

24 39 0

13 17 1

46 54 0

81 84 4

45 61 1

21 87 0

12 61 1

52 98 0

25 64 2

3 68 0

61 64 0

24 45 4

16 53 2

23 59 3

68 86 4

55 74 1

68 74 4

22 87 1

5 21 1

3 89 1

5 84 2

18 58 1

47 81 3

74 80 1

54 71 0

9 16 2

29 55 4

12 85 1

49 84 0

30 71 3

50 51 0

51 51 0

2 38 0

14 92 3

5 31 1

5 53 1

34 83 1

29 69 0

34 82 2

50 93 1

83 96 2

樣例輸出 copy603

140607

276408

1161

5444

7985

9779

9274

5261

9934

2118

9996

4133

2687

6932

7982

3829

2931

3078

8342

提示首先要做這個題,需要用矩陣快速冪來求第 n 項的斐波那契數列,因為矩陣乘法是有分配律的,所以當前進 k 天,也就是 的 k 次方 乘上原來線段樹維護的矩陣值,以及懶標記的值,那麼這個題就轉換成了區間乘法了,唯一需要的一點就是掏出來個好的矩陣板子,以前沒有存矩陣的板子,光這個板子就卡了我半天。

注意一下懶標的初始值設為 單位矩陣,區間和 設位 fib2矩陣() ,mp[ 0 ] [ 0 ]這個位置就是斐波那契的第1項,因為題意可知初始的時候都應該是第一項。

pushdown的時候注意 哪個矩陣乘上哪個矩陣,矩陣乘法是沒有交換律的,乘反了答案肯定是不對的。

套上板子之後,心情就變得愉悅起來了 ~

一開始還想用斐波那契數列模數有迴圈節打個表來做,結果這樣的方法只能支援單點修改,修改乙個區間是不現實的。。

改下**,盡量變得可讀性高一點吧,寫的太醜了。。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define x first

#define y second

#define l (u<<1)

#define r (u<<1|1)

#define mid (tr[u].l+tr[u].r>>1)

#define len(u) (tr[u].r-tr[u].l+1)

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

const

int n=

100010

,m=2

,mod=

10007

,inf=

0x3f3f3f3f

;const

double eps=

1e-6

;struct mat

//構建0矩陣

void

build_one()

//構建單位矩陣

void

build_fib1()

//構建

void

build_fib2()

//構建

mat operator

*(mat m)

const

//矩陣乘法

return ans;

} mat operator

+(mat m)

const

//矩陣加法

friend mat operator

^(mat m,

int b)

//矩陣快速冪

return ans;}}

;struct node

tr[n<<2]

;int n,m;

void

pushup

(int u)

void

pushdown

(int u)

void

build

(int u,

int l,

int r)

; tr[u]

.b.build_one()

;if(l==r)

build

(l,l,mid)

,build

(r,mid+

1,r)

;pushup

(u);

}void

modify

(int u,

int l,

int r,mat c)

pushdown

(u);

if(l<=mid)

modify

(l,l,r,c);if

(r>mid)

modify

(r,l,r,c)

;pushup

(u);

}int

query

(int u,

int l,

int r)

intmain()

return0;

}/**/

FZOJ P2109 卡德加的兔子

卡德加喜歡養兔子。他在達拉然的下水道裡放了 n 個兔籠 編號從 1 到 n 裡面養著他從德拉諾帶來的兔子。它們的繁殖遵循斐波那契數列的規律 剛開始時,籠子裡有一對剛出生的兔子。每對兔子在出生第二個月後,每個月都生一對兔子。第乙個月結束後有 1 對兔子。第二個月結束後有 2 對。卡德加從蘇拉瑪的的大魔...

Nginx之動靜分離配置 阿薩德卡卡的部落格

nginx之動靜分離 nginx的反向 我想大家應該了解,前端nginx 後端的tomcat,但是在處理靜態資源 相關等 上tomcat並不佔優勢。所以動靜分離利用nginx的location匹配,使靜態資源自己處理,或者交由其他伺服器處理,動態資源交給tomcat處理。這樣帶來的好處是加快了 的訪...

線刷和卡刷的區別以及步驟

你也可以檢視我的其他同類文章,也會讓你有一定的收貨!卡刷包一般是指代ota格式的更新包,它需要擁有差分更新的能力 在某些場合,卡刷包只包含新舊檔案的差別以節省空間。如果不使用這個特性,ota格式的包也可以接近成為完整的刷機包 因此需要乙個能操作單個檔案的平台上才能執行,這個平台就是recovery。...