求a^b的所有約數(即因子)之和,並對其取模 9901再輸出。
(0 <= a,b <= 50000000)
我們首先要用到這樣乙個定理,數字a的所有因數之和,
對於已經分解的整數a=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn)
有a的所有因子之和為:
s = (1+p1+p1^2+p1^3+...p1^k1) * (1+p2+p2^2+p2^3+….p2^k2) * (1+p3+ p3^3+…+ p3^k3) * .... * (1+pn+pn^2+pn^3+...pn^kn)
所以對於a^b , 假設a=(p1^k1)*(p2^k2)*(p3^k3)*....*(pn^kn),那麼a^b = a^b = p1^(k1*b) * p2^(k2*b) *...* pn^(kn*b);
所以 a^b的所有約數之和為:
sum = [1+p1+p1^2+...+p1^(a1*b)] * [1+p2+p2^2+...+p2^(a2*b)] *...* [1+pn+pn^2+...+pn^(an*b)].
每一行都是等比數列,等比求和然後mod9901就可以了,本來可以用逆元來求解的,但是這個題目好像好點問題所以使用的是首位相乘遞迴二分遞迴的解法。
#includeusing namespace std;
typedef long long ll;
const ll mod=9901;
ll a,b;
ll pow(ll p,ll n) //快速求冪
if(n&1)
ll ret=pow(p,n/2);
return ( ret * ret ) % mod;
}ll sum(ll p,ll n) //等比求和
if(n&1)
return ( (1+pow(p,n/2+1)) * sum(p,n/2-1) + pow(p,n/2) )% mod;
} ll cal()
ans=(ans*sum(i,b*b))%mod; }
if(a!=1)
return ans;
}
int main()
return 0;
}
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 逆元 分治
題意 傳送門 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 d...
poj1845 數論好題
求a b的所有因數和。a,b 50000000 分解質因數 a a1 b1 a2 b2 an bn 則 因數和為 a1 0 a1 1 a1 b1 a2 0 a2 1 a2 b2 an 0 an 1 an bn 乘法原理 a b a1 b1 b a2 b2 b an bn b 因數和為 a1 0 a1...