NYOJ 928 小M的因子和(数论)
生活随笔
收集整理的這篇文章主要介紹了
NYOJ 928 小M的因子和(数论)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
小M的因子和
時間限制:1000?ms ?|? 內存限制:65535?KB 難度:2 描述小M在上課時有些得意忘形,老師想出道題目難住他。小M聽說是求因子和,還是非常得意,但是看完題目是求A的B次方的因子和,有些手足無措了,你能解決這個問題嗎?
輸入每行兩個數 A ,B ,(1≤A,B≤10^9)?
分析:對A進行質因數分解,假設A = (p1^a1) * (p2^a2)*……*(pk^ak),假設A的因子和為sum,
則sum=(1 + p1 + p1^2 + ……+p1^a1)*(1+p2+p2^2 + ……+p2^a2)*……*(1+pk+pk^2+……+pk^ak),把這個式子展開之后.每一項剛好是A的因子。
所以求A^B的因子和時,只需把ai 改為ai*b,然后再求解即可。求得時候因為次方比較大,要用分治和快速冪來求。
#include <cstdio> #include <cmath> const int mod = 9901;int Pow(int a, int n) { //快速冪求a^nint res = 1;a %= mod;while(n) {if(n&1) res = res * a % mod;a = a * a % mod;n >>= 1;}return res; }int get_sum(int a, int n) { //求(1 + a + a^2 + …… + a^n)if(n == 0) return 1;if(n&1) return get_sum(a, n / 2) * (Pow(a, (n / 2 + 1)) + 1) % mod;else return (get_sum(a, n / 2 - 1) * (Pow(a, n / 2) + 1) + Pow(a, n)) % mod; }int main() {int a, b;while(~scanf("%d%d", &a, &b)) {int ans = 1;int m = (int)sqrt(a + 0.5);for(int i = 2; i <= m; ++i) {if(a % i == 0) {int k = 0;while(a % i == 0) {k++;a /= i;}ans = ans * get_sum(i, k * b) % mod;}}if(a > 1) ans = ans * get_sum(a, b) % mod;printf("%d\n", ans);}return 0; }總結
以上是生活随笔為你收集整理的NYOJ 928 小M的因子和(数论)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java 面试 80% 的人都会踩这些坑
- 下一篇: 你离BAT之间,只差这一套Java面试题