題意
傳送門 poj 1845
題解分解質因數 a=p
1e1p
2e2…
pnen
a=p_1^p_2^\dots p_n^
a=p1e1
p2
e2
…pne
n,則約數和為
( 1+
p1+⋯
+p1e
1)(1
+p2+
⋯+p2
e2)…
(1+p
n+⋯+
pnen
)(1+p_1+\dots +p_1^)(1+p_2+\dots +p_2^)\dots (1+p_n+\dots +p_n^)
(1+p1
+⋯+p
1e1
)(1
+p2
+⋯+p
2e2
)…(
1+pn
+⋯+
pnen
)逆元
對於質因數 p
ip_i
pi,根據等比數列求和公式,括號內求和為 pie
ib+1
−1pi
−1
\frac-1}
pi−1p
iei
b+1
−1 分子項快速冪求解,分母項逆元求解。對於 pim
odm=
1p_i\ mod\ m =1
pimod
m=1 的情況需要特殊處理,因為此時 pi−
1p_i-1
pi−
1 不存在逆元。對於正整數 n
nn,至多有乙個大於等於 n
\sqrt n
n的質因子,那麼逆元打表處理 [1,
n]
[1,\sqrt n]
[1,n]
的部分,對於超出這個範圍的部分,利用費馬小定理進行快速冪求逆元。
#include
#include
#include
#include
#include
using
namespace std;
#define mod 9901
typedef map<
int,
int> mp;
int a, b, inv[mod]
;mp prime_factor
(int n)}if
(n !=1)
res[n]=1
;return res;
}int
mod_pow
(int x,
int n)
return res;
}int
get_inv
(int n)
intmain()
printf
("%d\n"
, res)
;return0;
}
分治
考慮質因數 p
ip_i
pi,若 e
ie_i
ei 為奇數,設其括號內求和為 sum
(p,e
)sum(p,e)
sum(p,
e),則有sum
(p,e
)=(1
+p+⋯
+p⌊e
/2⌋)
+(p⌊
e/2⌋
+1+⋯
+pe)
=(1+
p⌊e/
2⌋+1
)×su
m(p,
⌊e/2
⌋)
sum(p,e)=(1+p+\dots+p^)+(p^+\dots +p^e)=(1+p^)\times sum(p,\lfloor e/2\rfloor)
sum(p,
e)=(
1+p+
⋯+p⌊
e/2⌋
)+(p
⌊e/2
⌋+1+
⋯+pe
)=(1
+p⌊e
/2⌋+
1)×s
um(p
,⌊e/
2⌋) 指數為偶數,將 pie
ip_i^
piei
加入答案後將 e
ie_i
ei 減一處理為奇數情況即可。
#include
#include
#include
#include
#include
using
namespace std;
#define mod 9901
typedef map<
int,
int> mp;
int a, b;
mp prime_factor
(int n)}if
(n !=1)
res[n]=1
;return res;
}int
mod_pow
(int x,
int n)
return res;
}int
sum(
int p,
int e)
intmain()
printf
("%d\n"
, res)
;return0;
}
poj1845 逆元 因子和
傳送門 主要目的還是記錄一下,學習了學長部落格寫的比我清楚很多 題意 求a b的因子和對9901取餘 思路 乙個數的因子和求法 對n素數分解,n p1 a1 p2 a2 pk ak 因子和 1 p1 p1 2 p1 a1 1 p2 p2 2 p2 a2 1 pk pk ak p1 a1 1 1 p1...
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...
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 到了這裡...