日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【9018题解】2109 卡德加的兔子

發(fā)布時(shí)間:2024/4/17 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【9018题解】2109 卡德加的兔子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述

卡德加有N個(gè)兔子籠,編號從1~N。剛開始每個(gè)兔子籠里有1對小兔,每個(gè)月小兔會長成大兔,之后的每個(gè)月這對大兔都會生出1對小兔。即兔子的繁殖遵循斐波那契數(shù)列的規(guī)律。
例如:第一個(gè)月1對小兔,第二個(gè)月1對大兔,第三個(gè)月1對小兔1對大兔,第四個(gè)月1對小兔2對大兔,第五個(gè)月2對小兔3對大兔……
卡德加學(xué)會了時(shí)間膜法,他可以對任意的[L,R]區(qū)間施加時(shí)間流逝K個(gè)月的膜法(如果他想要的話),使得這之中的兔子變?yōu)镵個(gè)月后的景象。
卡德加有時(shí)想喂兔子,所以他需要知道任意的[L,R]區(qū)間內(nèi)的兔子數(shù)量,即求出[L,R]區(qū)間內(nèi)共有多少兔子,大兔和小兔都需要算上。
這些操作都是在一個(gè)月內(nèi)完成的,所以不必考慮自然時(shí)間流逝對兔子的影響。

輸入

第一行兩個(gè)正整數(shù)N,M,表示兔子籠的數(shù)目和操作的數(shù)目。
接下來M行,每行三個(gè)整數(shù)L,R,K。如果K>0,表示卡德加想對區(qū)間[L,R]施放時(shí)間流逝K個(gè)月的膜法。如果K=0,表示卡德加想要喂兔子了,輸出區(qū)間[L,R]內(nèi)兔子總共有多少對。

輸出

對每個(gè)喂兔子的操作,輸出一行,一個(gè)數(shù),表示兔子的對數(shù)。答案對10007取模。

樣例輸入

10 10
1 3 2
1 1 0
2 4 0
3 5 0
4 7 3
3 5 0
1 4 0
2 7 0
1 9 4
2 10 0

樣例輸出

2
5
4
8
9
16
121

題解

很顯然的線段樹類型題,但是操作不簡單。
考慮區(qū)間[L,R]內(nèi)有A只小兔,B只大兔,那么經(jīng)過K個(gè)月后,會有多少只呢?
根據(jù)斐波那契數(shù)列的遞推式,寫出矩陣,再寫出公式:
\(\begin{bmatrix}0&1\\1&1\end{bmatrix}^{K}\cdot\begin{bmatrix}A\\B\end{bmatrix}=\begin{bmatrix}A'\\B'\end{bmatrix}\)
A'和B'就是K月之后的小兔和大兔數(shù)量。
對于矩陣乘方,可以使用矩陣快速冪。之后就可以和普通的線段樹一樣操作。
需要注意的是,這題有點(diǎn)卡常,所以注意對矩陣乘法和其它細(xì)節(jié)上的常數(shù)優(yōu)化。
優(yōu)化①:對于2*2的小矩陣,不寫結(jié)構(gòu)體,不用循環(huán),直接乘,會加快速度。
優(yōu)化②:這是一個(gè)很有技巧的優(yōu)化,注意到矩陣\(\begin{bmatrix}0&1\\1&1\end{bmatrix}^{20016}\)在模10007意義下等于單位矩陣,即K=K%20016對結(jié)果沒有影響。根據(jù)這一點(diǎn)可以進(jìn)行優(yōu)化。這一點(diǎn)是如何想到的呢?首先應(yīng)該想到,在模意義下,一切遞推式均會重復(fù)。然后可以打表找規(guī)律,找循環(huán)節(jié)。對于斐波那契數(shù)列,有定理宣稱,在模意義下,循環(huán)節(jié)長度不會超過模數(shù)的6倍。
優(yōu)化③:繼續(xù)在②的基礎(chǔ)上優(yōu)化,預(yù)處理出矩陣的0~20015次冪,做乘法時(shí)直接用,直接消滅了log和矩陣乘法的常數(shù)。
代碼如下:

1 #include<cstdio> 2 #include<cstring> 3 #define F(i,a,b) for(int i=a;i<=b;++i) 4 #define Mod 10007//題目要求的模數(shù) 5 #define Mod2 20016//循環(huán)節(jié)長度 6 #define getchar() (S==TT&&(TT=(S=BB)+fread(BB,1,1<<15,stdin),TT==S)?EOF:*S++) 7 char BB[1<<15],*S=BB,*TT=BB;//快讀而已 8 inline int I(){//快讀 9 int x=0;char c=getchar(); 10 while(c<'0'||c>'9')c=getchar(); 11 while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=getchar(); 12 return x; 13 } 14 int a1[262145],a2[262145],lazy[262145]; 15 int A00[20016],A01[20016],A10[20016],A11[20016];//處理前20016次冪 16 int n,m,a,b,k,tmpa1,tmpa2; 17 inline int mo(int x){return x<Mod2?x:x-Mod2;} 18 void init(){//預(yù)處理過程 19 A00[0]=A11[0]=1, A01[0]=A10[0]=0; 20 F(i,1,20015) A00[i]=A01[i-1], A01[i]=(A00[i-1]+A01[i-1])%Mod, A10[i]=A11[i-1], A11[i]=(A10[i-1]+A11[i-1])%Mod; 21 } 22 void Mogic(int&x,int&y,int K){//對[x,y]施放時(shí)間流逝K月 23 tmpa1=(A00[K]*x+A01[K]*y)%Mod, tmpa2=(A10[K]*x+A11[K]*y)%Mod; 24 x=tmpa1, y=tmpa2; 25 } 26 inline void push_down(int l,int r,int i){ 27 if(!lazy[i]) return; 28 Mogic(a1[i<<1],a2[i<<1],lazy[i]); 29 Mogic(a1[i<<1|1],a2[i<<1|1],lazy[i]); 30 lazy[i<<1]=mo(lazy[i<<1]+lazy[i]); 31 lazy[i<<1|1]=mo(lazy[i<<1|1]+lazy[i]); 32 lazy[i]=0; 33 } 34 void build(int l,int r,int i){ a1[i]=(r-l+1)%Mod; if(l<r) build(l,(l+r)>>1,i<<1), build(((l+r)>>1)+1,r,i<<1|1);} 35 void Xu(int l,int r,int i){//時(shí)間流逝 36 if(r<a||b<l) return; 37 if(a<=l&&r<=b) { Mogic(a1[i],a2[i],k); lazy[i]=mo(lazy[i]+k); return; } 38 push_down(l,r,i); 39 Xu(l,(l+r)>>1,i<<1); 40 Xu(((l+r)>>1)+1,r,i<<1|1); 41 a1[i]=(a1[i<<1]+a1[i<<1|1])%Mod; 42 a2[i]=(a2[i<<1]+a2[i<<1|1])%Mod; 43 } 44 int Feed(int l,int r,int i){//喂兔子 45 if(r<a||b<l) return 0; 46 if(a<=l&&r<=b) return (a1[i]+a2[i])%Mod; 47 push_down(l,r,i); 48 return (Feed(l,(l+r)>>1,i<<1)+Feed(((l+r)>>1)+1,r,i<<1|1))%Mod; 49 } 50 int main(){ 51 init(); 52 n=I(),m=I(); 53 build(1,n,1);//建樹 54 F(i,1,m){ 55 a=I(),b=I(),k=I(); 56 if(k) { if(k%=Mod2) Xu(1,n,1); }//這里如果k是20016的倍數(shù),就不用動了 57 else printf("%d\n",Feed(1,n,1)); 58 } 59 return 0; 60 }

轉(zhuǎn)載于:https://www.cnblogs.com/PinkRabbit/p/7429964.html

總結(jié)

以上是生活随笔為你收集整理的【9018题解】2109 卡德加的兔子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。