題解 P6435 EZEC 1 數列

2022-03-28 19:16:08 字數 3189 閱讀 3415

傳送門

久違地來一波題解,來乙個數學角度推式子的方法

記第 \(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...