當初寫過一篇分治的
題意:求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))
注意到約數之和的每一項都是等比數列,可以用通項搞他,先用快速冪計算分子,再求出分母的乘法逆元。
特別地,當分母pi-1為9901的倍數時,乘法逆元不存在,但是1,pi,pi^2...pi^(ci*b) ≡ 1 (mod 9901)
所以此時貢獻即為b*ci+1 mod 9901
#include#include#define ll long long
#define r register int
using
namespace
std;
const
int m=9901
;inline
intg()
inta,b,cnt;
int p[20],c[20
];ll ans=1
;inline
void div(int
n)
if(n>1) p[++cnt]=n,c[cnt]=1;}
inline
int qpow(int a,ll p)
signed main()
r x=(qpow(p[i],(ll)b*c[i]+1)-1+m)%m;
r y=qpow(p[i]-1,m-2
); ans=(ll)ans*x%m*y%m;
} printf(
"%lld\n
",ans);
}
2019.05.11
Poj1845 Sumdiv 解題報告
真沒想到!其實我們可以先將 a b 分解成質因數的 因為 a b 的因數肯定是 a b 的質因數在一定的條件下相乘而成的 然後組合一下 h ovny 走開!別誤導別人!來一波公式 所有因數的和 pi 讀作pi,是 pi 的大寫,表示累乘 sigma 讀作sigma,是 sigma 的大寫,表示累加 ...
poj 1845 Sumdiv ,質因子分解
題意 求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為奇數,一共有偶...
POJ1845Sumdiv(逆元or等比數列求和)
附上acdreamer的講解 題目 題意 給定兩個正整數9901取餘後的值。分析 很容易知道,先把 的所有因子和的表示式如下 所以我們有兩種做法。第一種做法是二分求等比數列之和。如果採用等比數列首項為一次項的計算方法,則需要另外加上1 include include includeusing nam...