poj 1845 求A B的約數之和

2022-08-12 13:00:16 字數 1536 閱讀 5678

題意:

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

思路:

大數模運算。兩個最基本公式:(a*b)%c = ((a%c)(b%c))%c 和 (a+b)%c = ((a%c)+(b%c))%c 。用__int64的原因為 n = cnt[i] b (cnt[i]為a第i個素因子的個數)可能會超int。

1: 對a進行素因子分解得

a = p1^a1 * p2^a2 * p3^a3 *...* pn^an.
故 a^b = p1^(a1*b) * p2^(a2*b) … pn^(an*b);

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

sum = [1+p1+p1^2+...+p1^(a1*b)] * [1+p2+p2^2+...+p2^(a2*b)] *...* [1+pn+pn^2+...+pn^(an*b)].
如 200 = 2^3 * 5^2 : sum(200) = [1 + 2 + 4 + 8] * [1 + 5 + 25].

3: 求等比數列1+pi+pi^2+pi^3+…+pi^n可以由遞迴形式的二分求得:(模運算不能用等比數列和公式!)

若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))

如:1 + p + p^2 + p^3 + p^4 + p^5 = (1 + p + p^2) * (1 + p^3)

若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);

如:1 + p + p^2 + p^3 + p^4 = (1 + p) * (1 + p^3) + p^2

上述分析copy自:

#include

#include

#include

using namespace std;

typedef long long ll;

const int mod=9901;

int qmod(ll a,ll n) //快速冪取模

return ans;

}ll sum(ll p,ll n) //遞迴求和

int p[100],cnt[100],tot;

void getfact(int a) //分解質因數

tot++;}}

if(a!=1)

}int main()

poj1845 約數之和

本題應該說是乙個數學問題了。首先暴力肯定是不行的。首先我們把a分解質因數,表示為p1 c1 p2 c2 pn cn.那麼a b就可以表示為 p1 c1 b p2 c2 b pn cn b 那麼很明顯了,所有約數的集合就是p1 k1,p2 k2 pn kn.其中0 ki b ci 1 i n 到了這裡...

Poj1845 冪的約數之和

時間限制 1 sec 記憶體限制 128 mb 提交 狀態 我的提交 給定正整數a,b,求a b的所有因數之和,並模9901。僅一行,有兩個整數a和b 0 a,b 50000000 第1行 問題的答案 copy 如果複製到控制台無換行,可以先貼上到文字編輯器,再複製 2 3 15 2 3 8 8 的...

求A B的所有約數和 POJ1845

1 include 2 include 3 include 4 include 5 6using namespace std 78 long long arr1 100000 9 long long mod 9901 10 11long long multi long long a,long lon...