這裡等比數列求和使用到的知識點包括:分治和快速冪
其中分治的方法和快速冪的方法是從部落格中學習到的:
等比數列分治求和:
快速冪方法:
結合到本題目中可參考完整**。
在分治求和和快速冪之外取模操作的實現解釋如下:
根據描述可知最後的值是很大的,所以需要取餘,但實際上在計算的過程中就需要進行取餘操作了。所以需要對快速冪函式和分治函式進行一下處理:
首先操作的基礎公式(取餘的等價式):
(a + b) % p = (a % p + b % p) % p (1)
(a - b) % p = (a % p - b % p + p) % p (2)
(a * b) % p = (a % p * b % p) % p (3)
a ^ b % p = ((a % p)^b) % p (4)
基於(4)首先需要對快速冪的乘數進行取模處理,然後在乘起來每乙個值之前還需要對result進行取模處理,然後還需要對乘起來的值進行取模。這樣才能保證快速冪得到的值得到了正常的取模處理(之前就是這裡出錯所以測試點只過了乙個)
基於(1)和(3)需要對分治求和的返回結果分別進行取模處理。
坑點:
取餘出現負數:資料超出了範圍,是沒正確取餘導致的,因為正數取餘不會得到負數。
#includeusing namespace std;long long mod = 987654323;
long long quickpow(long long q,long long cnt)
mq*=mq;
mq%=mod;
// if(cnt&1!=0)
//
// mq*=mq;
cnt>>=1;
} return result%mod;
}long long getsum(long long q,long long cnt)
else//偶數 }
int main()
return 0;
}
2016級演算法第一次練習賽 A 群鴉的盛宴
本題乍一眼看過去,你可能會想到使用乙個二維陣列a 51 51 來記錄從i到j的路線數。你很厲害,這是dp的思想。可是什麼情況才用dp 分解得到子問題往往不是互相獨立的。這也是dp和分治的最大區別之一。這題我從a走到b,和a之前b之後的格仔完全沒有關係啊!so,冷靜一下再看看,你會發現從1走到3和從2...
2018級第一次上機《點燈》題解
時間限制 300ms 記憶體限制 65536kb有n個燈,編號0 n 10 n 1,一開始都是關閉狀態。每次操作會撥動乙個區間 l,r 燈的開關,也就是說,對於燈i,l i rl i r,如果i是關閉狀態,則操作會使燈亮,反之會使燈滅。請問k次操作後有多少燈亮著。多組輸入資料 每組資料第一行兩個數n...
2016演算法第一次練習賽 A 群鴉的盛宴
時間限制 300ms 記憶體限制 32768kb alvinzh總是比別人慢一拍,比如暑假大家都在追權遊7討論龍母和雪諾大人尷尬相遇的時候,他還在第一季震驚地看著三隻剛出生的小龍。alvinzh的進度很慢,因為他一邊刷著電視劇集,一邊還在看原版 所以現在才看到第五季,雪諾在這頭,龍母在那頭。alvi...