二分遞迴求等比數列前n項和

2021-09-23 15:37:50 字數 1052 閱讀 6507

2019河北省大學生程式設計競賽(重現賽)b

我們假設有乙個等比數列: a[n] = q ^ n

那麼 s[n] = q ^ 1 + q ^ 2 + q ^ 3 …… + q ^ n

正常情況我們有 s[n] = q * (1 - q ^ n) / (1 - q)

若我們需要求的是 s[n] % mod 且 (1 - q)與mod不互質,那麼上面的公式便會有問題(逆元無法確定)

這時候我們發現:

如果n為奇數: s[n] = s[n / 2] + a[(n - 1) / 2 + 1]×s[n / 2] + a[(n - 1) / 2 + 1]

如果n為偶數: s[n] = s[n / 2] + a[n / 2]×s[n / 2]

如果n為偶數,我們可以將n分成兩個部分,s[n] = s[n / 2] + 後一部分

然後我們發現後一部分其實可以又前一部分乘乙個數得來,這個數為a[n / 2 + 1] / a[1],即為q ^ (n / 2)

如果n為奇數,我們可以模擬偶數情況,在兩部分間加乙個數,這樣第一部分和第三部分同偶數情況處理,在額外加上中間的數

/*

二分求等比數列前n項和(首項等於公比)

(1)當n為偶數,可將n分為前後兩個部分,後部分可以看成前部分每項乘以q^k,這個k即為n/2

(2)當n為奇數,同理偶數,可看成三個部分,前後部分與偶數類似,中間部分是乙個數,即為a[(n - 1) / 2 + 1],前後部分之間需乘以q^((n - 1) / 2 + 1)

*/#include using namespace std;

typedef long long ll;

typedef unsigned long long ull;

ll n, q, p;

ll q_pow(ll a, ll b)

return c;

}ll dfs(ll x)

else //(1 + a[n / 2]) * s[n / 2]

return dd;

}int main()

}

等比數列求和,二分遞迴

s i 1n qi mod p 等比數列取模求和 解析 因為取模操作,直接運用等比數列求和公式無法做出,所以需要用到公式求等比為k的等比數列之和s n 當n為偶數 s n s n 2 pow k,n 2 s n 2 當n為奇數 s n s n 2 pow k,n 2 s n 2 pow k,n 等比...

實現分治法求等比數列和

問題 形如1 p p 2 p 3 p 4 p c 解析 分治的思想,就是把乙個問題劃分為若干個規模更小的同類子問題,對這些子問題遞迴求解,然後在回溯時通過它們推導出原問題的解。對於此問題,我們就可以直接轉化為求更小的等比數列和的問題。相信很容易想到的思路就是先求p 0,然後再求p 1 累加,然後在此...

C 用遞迴求前n項階乘的和

求前n項階乘的和。includeusing namespace std 求某項階乘的值 5 1 2 3 4 5 int fun int i 求前n項階乘的和 s x f 1 f 2 f x int fun2 int i 求前n項階乘的和 s x f 1 f 2 f x int fun2 int i ...