C 無窮無盡的力量2.0
稍加思考,發現 3*3除中間外的任意點(止步於此) 而 3*4 以上的棋盤就能跳到任意點
對於 1*n 的棋盤,顯然只能在初始格
對於 2*n(n+1)/2 格
代碼略
D 無窮無盡的小數
從簡到難,先考慮兩個小數循環節長度相同,大減小的情況
稍加思考發現結果的循環節事實上就是 大數循環節 - 小數循環節100,超出了long long 的範圍,因此採用高精度減法解決
接着考慮長度不同怎麼搞?
由於循環節重複若干次組成的依然是循環節,因此直接取兩個循環節的最小公倍數,將兩個數擴大到相同長度即可,這樣最大長度也才 ,數組完全裝得下,高精減沒問題
最後如果是小減大呢?
在計算器中試了一下,如果是 0.a-0.b(a<b) 的結果
這裏拿 0.2222222 - 0.333333 為示例
得到 -0.1111111 ,循環節的 1 可以看成是 3 - 2 得到的
而本題不考慮負數,因此加一個1,對循環節來説,原本的循環節 x9-x
事實上原本的 a - b 看成 1 + a - b 而小數位為了湊 1 需要每一位都湊一個 9
比如 - 0 . 1234 ,加一個1就相當於用 0.99999 去減這個數 ,也就成了 0.8765
本題錯誤點:循環節0與循環節9不相等(出題人估計沒考慮到
代碼略
E 無窮無盡的樹
樹形dp模板題,葉子節點沒有貢獻在dfs時直接判斷入度為一的非根節點直接跳過即可
主要考慮一下怎麼轉移狀態
我們定義兩個數組 smdsmn (son's max deep number) (蹩腳英文這一塊,夢到什麼取啥名) 用於記錄每個節點子樹刪除葉子節點後最大深度與最大深度的節點數目
考慮每個點的初始化,一個孤獨的非葉子節點最大深度顯然是該點深度,節點數自然是 1
由於每個點的答案來自於子樹,我們採取dfs遞歸,搜索完節點 uu 點的答案
對於一個節點 uv ,考慮三種情況
- u 之前的子樹最大深度不夠大,更新最大深度與數目
smd[u] = smd[v] ;
smn[u] = smn[v] ;
- smd[v]==smd[u] : 累計節點數即可
smn[u] += smn[v] ;
- smd[v] < smd[u]vu 的答案無貢獻,忽略即可
本體錯誤點:無向圖鏈表開雙倍空間。。。(what can I say
F 無窮無盡的數
快速冪與前綴和
算是一道典型的數論題,難度不算高,噁心程度視考試剩餘時間與紅温程度改變(數論題都這樣的説
考慮一般情況 ,lr 之間可以分為三部分:(事實上拆分成兩頭的碎塊和中間的完整部分)
- llnxt
- 最後一個循環節(rrlst)到 r
- lnxt +1rlst-1 (即中間所有的完整循環節
先考慮碎塊怎麼處理
由於碎塊長度不超過 10^5o(n) 效率秒了,代碼如下
lld tm=1;//存10的次冪
for(int i=1;i<=n;i++){
int fnow=s[(i-1)%n]-'0';
fm[i]=(fm[i-1] *10 %Mod +fnow) %Mod;//fm[i]表示 前i位組成的數%Mod 的結果
int bnow=s[(n-i)%n]-'0';
bm[i]=(bm[i-1] +bnow *tm %Mod) %Mod;//bm[i]表示 後i位組成的數%Mod 的結果
tm=(tm*10) %Mod;
}
接着考慮中間的完整塊怎麼搞
假設中間完整塊總共有 numn,一塊完整循環節 %Mod 的結果是 xnum 塊拆開來看就成了:
x+x*10^n+x*10^{2n}+...+x*10^{(num-1)*n}
顯然是個等比數列,採用等比數列求和化簡為:
x*(\frac{{10^n}^{num}-1}{10^n -1})
考慮怎麼求模998244353意義下的這一堆
x10^n{10^n}^{num}{10^n}^{Mod-2}10^n-1 肯定和998244353互質
代碼實現如下:
lld Pow(lld a,lld b){
lld ans=1;
while(b){
if(b&1) ans=ans*a%Mod;
a=a*a%Mod;
b>>=1;
}
return ans%Mod;
}
//下面是main函數中的一部分
lld num=((rlst-1)-(lnxt+1)+1)/n;//塊數
lld q=Pow(10,n);//公比
lld p=(Pow(q,num)-1)%Mod * Pow(q-1,Mod-2) %Mod; //等比數列化簡後括號裏那一坨
ans=fm[n] *p %Mod;//fm[n] 就是一個完整循環節%Mod的結果
最後考慮怎麼合併這三部分
顯然讓第一和第二部分乘10的對應次冪就行,這裏依然使用快速冪計算10的冪次%Mod結果,注意一下具體奪少次就行
一般情況搞定了,接下來考慮一下特例
如果中間沒有完整塊,那麼分為兩個碎塊依然可以按照前綴和後綴的方法搞定
如果 lrrl 用算前綴的方法算就ok了