《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂
文章目錄
- 題目解答
- 題目來(lái)源
題目解答
來(lái)源:acwing
分析:
快速冪參考筆者的這篇博文:
算法刷題-數(shù)論-組合數(shù)、快速冪、逆元、遞推求組合數(shù)、逆元求組合數(shù)
約數(shù)之和參考筆者的這篇博文:
算法刷題-數(shù)論-試除法求約數(shù)、約數(shù)個(gè)數(shù)、約數(shù)之和、最大公約數(shù)(輾轉(zhuǎn)相除法)
假設(shè)N分解質(zhì)因數(shù)的結(jié)果是:
N=p1a1×p2a2×...×pkakN={p_1}^{a_1}\times{p_2}^{a_2}\times...\times{p_k}^{a_k}N=p1?a1?×p2?a2?×...×pk?ak?
則這個(gè)數(shù)N的約數(shù)之和等于
(p10+p11+p12+...+p1a1)×(p20+p21+p22+...+p2a2)×...×(pk0+pk1+pk2+...+pkak)(p_{1}^{0}+p_{1}^{1}+p_{1}^{2}+...+p_{1}^{a_{1}})\times(p_{2}^{0}+p_{2}^{1}+p_{2}^{2}+...+p_{2}^{a_{2}})\times...\times(p_{k}^{0}+p_{k}^{1}+p_{k}^{2}+...+p_{k}^{a_{k}})(p10?+p11?+p12?+...+p1a1??)×(p20?+p21?+p22?+...+p2a2??)×...×(pk0?+pk1?+pk2?+...+pkak??)
以上稱為“約數(shù)和定理”,在小學(xué)奧數(shù)中有應(yīng)用。
下面的sum(p,k)就是用來(lái)等比數(shù)列求和。答案就是所有的相乘。
AC代碼
#include<bits/stdc++.h> using namespace std; const int mod = 9901; // 快速冪求a ^k % mod int qmi(int a, int k){a %= mod;int res = 1;while(k){if( k & 1) res = res * a % mod;a = a * a % mod;k >>= 1;}return res; } // 求 p^0 + p^1 + ... + p ^k 等比數(shù)列求和 int sum(int p, int k){if( k == 0) return 1;// k 是偶數(shù),則0到k是k+1個(gè)數(shù),奇數(shù)個(gè)數(shù)if( k % 2 == 0) return ((long long)p * sum(p, k-1) + 1) % mod;//偶數(shù)個(gè)數(shù)的處理return (1 + qmi(p, k/2 + 1)) * sum(p, k/2) % mod;}int main(){int A, B;cin >> A >> B;int res = 1;// 求出A的每個(gè)約數(shù)的個(gè)數(shù)sfor(int i = 2; i <= A; i ++){int s = 0; // s是約數(shù)個(gè)數(shù)while( A % i == 0){s ++;A /= i;}if(s) res = res * sum(i, s * B) % mod;}if(!A) res = 0;cout << res << endl; }題目來(lái)源
https://www.acwing.com/problem/content/99/
總結(jié)
以上是生活随笔為你收集整理的《算法竞赛进阶指南》打卡-基本算法-AcWing 97. 约数之和:递归、快速幂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《算法竞赛进阶指南》打卡-基本算法-Ac
- 下一篇: 《算法竞赛进阶指南》打卡-基本算法-Ac