poj 1845 Sumdiv ,質因子分解

2021-06-24 12:01:43 字數 1228 閱讀 9577

題意:

求a^b的所有約數之和。

題解:

a = p1^a1 * p2^a2 * ... * pn^an.

a^b的所有約數之和為:

sum = [1+p1+p1^2+...+p1^(a1*b)] * [1+p2+p2^2+...+p2^(a2*b)] *...* [1+pn+pn^2+...+pn^(an*b)].

用遞迴二分求等比數列1+pi+pi^2+pi^3+...+pi^n:

(1)若n為奇數,一共有偶數項,則:

1 + p + p^2 + p^3 +...+ p^n

= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))

= (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))

上式紅色加粗的前半部分恰好就是原式的一半,那麼只需要不斷遞迴二分求和就可以了,後半部分為冪次式,將在下面第4點講述計算方法。

(2)若n為偶數,一共有奇數項,則:

1 + p + p^2 + p^3 +...+ p^n

= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)

= (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);

上式紅色加粗的前半部分恰好就是原式的一半,依然遞迴求解

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 20000;

const int mod = 9901;

int p[maxn], k[maxn], cnt = 0;

ll pow(ll a, ll b)

return res;

}void factor(int n)

cnt++;

}if(i==2) i--;

}if(n>1)

}ll sum(ll p, ll n)

int main() {

int a, b;

scanf("%d%d", &a, &b);

factor(a);

ll ans = 1;

for(int i=0; i

POJ1845 Sumdiv 數學?逆元?

當初寫過一篇分治的 題意 求a b的所有因子之和,並對其取模 9901再輸出 對於數a p1 c1 p2 c2 pn cn,它的所有約數之和為 1 p1 p1 2 p1 3 p1 c1 b 1 p2 p2 2 p2 3 p2 c2 b 1 pn pn 2 pn 3 pn cn b 注意到約數之和的每...

Poj1845 Sumdiv 解題報告

真沒想到!其實我們可以先將 a b 分解成質因數的 因為 a b 的因數肯定是 a b 的質因數在一定的條件下相乘而成的 然後組合一下 h ovny 走開!別誤導別人!來一波公式 所有因數的和 pi 讀作pi,是 pi 的大寫,表示累乘 sigma 讀作sigma,是 sigma 的大寫,表示累加 ...

POJ1845Sumdiv(逆元or等比數列求和)

附上acdreamer的講解 題目 題意 給定兩個正整數9901取餘後的值。分析 很容易知道,先把 的所有因子和的表示式如下 所以我們有兩種做法。第一種做法是二分求等比數列之和。如果採用等比數列首項為一次項的計算方法,則需要另外加上1 include include includeusing nam...