時間限制: 1 sec 記憶體限制: 128 mb
[提交][狀態][我的提交]
給定正整數a, b,求a^b的所有因數之和,並模9901。
僅一行,有兩個整數a和b(0 <= a,b <= 50000000)
第1行:問題的答案
copy (如果複製到控制台無換行,可以先貼上到文字編輯器,再複製)
2 3
15
2^3 = 8
8 的約數是1, 2, 4, 8,相加得到15
對於乙個大於1正整數n可以分解質因數:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
則由約數個數定理可知n的正約數有(a₁+1)(a₂+1)(a₃+1)…(ak+1)個,
那麼n的(a₁+1)(a₂+1)(a₃+1)…(ak+1)個正約數的和為
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)
證明:若n可以分解質因數:n=p1^a1*p2^a2*p3^a3*…*pk^ak,
可知p1^a1的約數有:p1^0, p1^1, p1^2......p1^a1
... ...
同理可知,pk^ak的約數有:pk^0, pk^1, pk^2......pk^ak ;
實際上n的約數是在p1^a1、p2^a2、...、pk^ak每乙個的約數中分別挑乙個相乘得來,
可知共有(a₁+1)(a₂+1)(a₃+1)…(ak+1)種挑法,即約數的個數。
它們的和為:
f(n)=(p1^0+p1^1+p1^2+…p1^a1)(p2^0+p2^1+p2^2+…p2^a2)…(pk^0+pk^1+pk^2+…pk^ak)
本題將a分解質因數,並記錄每種質因數的總個數,乘b,即a^b中共有該種質因數的個數,再利用約數和公式計算。
值得注意的是,本題對結果取模9901,而等比數列前n項和公式中涉及除法運算,故不能在快速冪中取模,那麼long long會溢位,所以此處
採用二分法求等差數列前n項和。(notes for more information)
#include#include#include#include#include#includeusing namespace std;
const int mod=9901;
int a,b;
long long ans=1;
long long qmul(long long p,long long k)
return s;
}long long get_sum(long long p,long long k)
void get_pr(int num)
return ;
}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 到了這裡...
poj 1845 求A B的約數之和
題意 求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 ...
POJ 1845乘法逆元 約數和
乘法逆元計算等比數列的求和公式 給兩個正整數a和b,計算ab的所有因子和的值對9901取模 約數和公式 s 1 p1 p1 2 p1 k1 1 p2 p2 2 p2 k2 1 pn pn 2 pn 3 pn kn 等比數列公式 pb c 1 1 p1 1 當模數mod為質數時,bmod 2逆元即為b...