傳送門
久違地來一波題解,來乙個數學角度推式子的方法
記第 \(k\) 次合併後的第 \(i\) 個數為 \(f_\)
根據題意,所求即為 \(ans=f_\) ,且有:
\(f_=af_+bf_+c,f_=i\)
形式上,我們設 \(\exists d\wedge f_+d=a(f_+d)+b(f_+d)\)
則不難換算出 \((a+b-1)d=c\)
注意,只是形式上這樣設, \(d\) 可能本身不存在記 \(g_=f_+d\) 則得到: \(g_=ag_+bg_\)
考慮 \(g\) 之間的轉移,發現與楊輝三角類似,故考慮每個 \(g_\) 的貢獻,很容易得到:
\(\displaystyle g_=\sum_^n\dbinoma^b^g_\)
代回 \(g_=f_+d,f_=i,ans=f_\) ,換元 \(i=i-1\) 得
\(\displaystyle ans=\sum_^\dbinomia^b^i(i+1+d)-d\)
按 \(d\) 展開後得到:
\(\displaystyle ans=\sum_^\dbinomia^b^i\cdot (i+1)+d[\sum_^\dbinomia^b^i-1]\)
後半部分是個很顯然的二項式定理,求和得到 \((a+b)^\)
再代回 \((a+b-1)d=c\) 得到:\(\displaystyle ans=\sum_^\dbinomia^b^i(i+1)+c\cdot -1\over (a+b)-1}\)
接著,我們建構函式,設 \(\displaystyle f(x)=\sum_^\dbinomia^x^=x(a+x)^\)
因此 \(\displaystyle f(x)=\sum_^\dbinomia^x^i\cdot (i+1)=[x(a+x)^]=(a+x)^+x\cdot (a+x)^\cdot (n-1)\)
整理得到: \(\displaystyle \sum_^\dbinomia^x^i\cdot (i+1)=(a+x)^\cdot (a+nx)\)
所以得到 \(\displaystyle \sum_^\dbinomia^b^i\cdot (i+1)=(a+b)^\cdot (a+nb)\)
最後我們得到: \(ans=(a+b)^\cdot (a+nb)+c\cdot \over 1-(a+b)}\)
法一:
對於前半部分,快速冪 \(o(\log n)\) 可直接算出;而後半部分,可能不存在 \(1-(a+b)\) 的逆元,不能直接求解
考慮到其形式上為等比數列求和式,展開為: \(1+(a+b)+(a+b)^2+\cdots +(a+b)^\)
設 \(sumq(q,n)=1+q+q^2+\cdots +q^n\)
則取乙個數 \(m\) ,使得 \(1+q+q^2+\cdots +q^n=(1+q+q^2+\cdots +q^m)(1+q^+q^+q^\rfloor\cdot (m+1)})+q^\rfloor\cdot (m+1)+1}(1+q+\cdots)\)
因此 \(sumq(q,n)=sumq(q,m)\cdot sumq(q^,\lfloor\rfloor)+q^\rfloor\cdot (m+1)+1}\cdot sumq(q,n-m-\lfloor\rfloor\cdot (m+1)-1)\) ,可以遞迴求解
通過估算,大概 \(m=\sqrt n\) 時最優
現分析求 \(sumq(q,n)\) 的複雜度:
記 \(k=\log n\) 則 \(t(k)=3t()+k\)
再記 \(2^a=k\) 則 \(t(a)=3t(a-1)+\cdot 2^a\)
解遞推方程得到 \(t(a)=3^a+o(3^a)=o(3^a)\)
代回得 \(3^a=2^=k^=\log^ n\)
#includeusing namespace std;
typedef long long ll;
ll n,a,b,c,p,ans=1;
inline __int128 fpow(__int128 a,ll x)
inline __int128 sumq(__int128 q,ll n),q>1\) 的形式
設 \(\bmod p=t\)
則 \(-kp=t\)
移項得到 \(q^n-kp(q-1)=t(q-1)+1\)
因此 \(q^n\bmod p(q-1)=t(q-1)+1\)
由於我們所求為 \(t\) ,因此得出:
\(t=\)
我們直接把 \(q\) 在模 \(p(q-1)\) 的意義下跑快速冪,結果直接進行這個處理,就能得到我們索要的結果了
其中,\(p(q-1)\leq 10^\cdot (10^9+10^9)=2\times 10^\) ,要使用 __int128
由於數值過大,甚至對 __int128 寫拆位的快速乘都不行,因此只能龜速乘
時間複雜度為 \(o(\log^2 n)\) ,但由於沒有遞迴,執行速率好像反而比法一快
【**】
#includeusing namespace std;
typedef long long ll;
ll n,a,b,c,p,ans=1;
inline __int128 fpow(__int128 a,__int128 x,__int128 m)
//不用龜速乘的快速冪
inline __int128 fmul(__int128 a,__int128 x,__int128 m)
inline __int128 fpoww(__int128 a,__int128 x,__int128 m)
int main()
//不用龜速乘的快速冪
inline __int128 fmul(__int128 a,__int128 x,__int128 m)
inline __int128 fpoww(__int128 a,__int128 x,__int128 m)
int main(){
cin>>n>>a>>b>>c>>p;
if(n>1) ans=fpow(a+b,n-2,p)*(a+(__int128)n*b%p)%p + (fpoww(a+b,n-1,(__int128)p*(a+b-1))-1)/(a+b-1)*c%p +p;
cout《目前好像是榜一
開了 o2
不開 o2
P7713 EZEC 10 打分 題解
題目傳送門 可能更好的閱讀體驗 很簡單的貪心,我們可以把打分的情況分為三種討論。顯然,如果要使得答案盡量大,就盡量把除最小得分以外的分數都加成最大的分數。我們可以假設要把除最小值 最大值以外的分數都變成最大分需要加 sum 分,這樣就可以舉出三種情況 1.sum m 剛好可以把除了最大值與最小值以外...
題解 P5175 數列
luogup5175 數列 n leq 10 這擺明要用矩陣 ans sum na i 2 a n x cdot a y cdot a rightarrow a n 2 x 2a 2 2xy cdot a a y 2a 2 所以我們可以知道 color a and a cdot a color 所以...
題解 P2710 數列
區間操作集大成者 可能吧 by某位不願意透露姓名的巨學 本題需要實現 共七個操作 全部操作都涉及到序列 於是我們考慮使用splay或者fhq treap實現 這裡使用fhq treap 前置芝士 蛤?不會?左轉度娘 必應娘 谷歌娘 左轉p3391題解區,包教包會,不會不要錢本來就不要錢吧 左轉p45...