題意:
求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...