題目描述:
假設現在有兩個自然數a和b,s是a^b的所有約數之和。
請你求出s mod 9901的值是多少。
輸入格式
在一行中輸入用空格隔開的兩個整數a和b。
輸出格式
輸出乙個整數,代表s mod 9901的值。
資料範圍
0≤a,b≤5×1070≤a,b≤5×107
輸入樣例:
2 3
輸出樣例:
15
注意: a和b不會同時為0。
分析:公式推導:
第一步,質因數分解:由算術基本定理得任意乙個數a = p1^k1 * p2^k2 * … * pn^kn。(其中p1-pn為a所有的質因數),則a^b = p1^k1b * p2^k2b * … * pn^knb。
第二步(補充),因子個數,設x為a的乙個約數,則x必定可由若干個p1-pn相乘得到,對於任乙個質因子pi,可為其他因子貢獻的數量為從0到ki,共1+ki個。由乘法原理得,數a所有的因子個數為c = (k1+1) * (k2+1) * … * (kn + 1).
第三步,因子和,設sn = (p1^0 + p1 ^1 + … + p1^k1)* (p2^0 + p2 ^1 + … + p2^k2)* … * (pn^0 + pn ^1 + … + pn^kn),展開可得到c項,每一項都是a的因子。
第四步,公式推導,設sum(p,k) = p^0 + p ^1 + … + p^k. 一共k+1項,我們對k分類討論,k為奇數時,k+1為偶數,例如k = 7,sum(p,7) = (p^0 + p^1 + p^2 + p^3 ) + (p^4 + p^5 + p^6 + p^7)
我們對其分成數量相等的兩組式子,又p^4 + p^5 + p^6 + p^7 = p^4 * (p^0 + p^1 + p^2 + p^3 ),所以sum(p,7) = (p^0 + p^1 + p^2 + p^3 ) * (1 + p^4).更一般的,sum(p,k) = (p^0 + p^1 + … + p^k/2 ) * (1 + p^(k/2+1) ) = sum(p,k/2) * (1 + p^(k/2+1) ) ,其中k為奇數.
k為偶數時,k+1為奇數,sum(p,k) = p^0 + p ^1 + … + p^k = 1 + p * (p^0 + p ^1 + … + p^(k-1) ) = 1 + p * sum(p,k-1).
當然,最後需要注意的是,我們求a^b的約數和時,呼叫的sum(p,k),k應該是第一步推導的kb。並且k為奇數時,我們求冪可以使用快速冪演算法。
#include using namespace std;
const int mod = 9901;
int binarypow(int a,int k)
return res;
}int sum(int p,int k)
int main()
if(s) res = res * sum(i,s * b) % mod;
} if(!a) res = 0;
cout
}
約數之和(acwing)
假設現在有兩個自然數a和b,s是ab 的所有約數之和。請你求出s mod 9901的值是多少。輸入格式 在一行中輸入用空格隔開的兩個整數a和b。輸出格式 輸出乙個整數,代表s mod 9901的值。資料範圍 0 a,b 5 107 輸入樣例 2 3輸出樣例 注意 a和b不會同時為0。include ...
AcWing 約數之和 約數和定理
時 空限制 1s 64mb 給定n個正整數ai,請你輸出這些數的乘積的約數之和,答案對109 7取模。第一行包含整數n。接下來n行,每行包含乙個整數ai。輸出乙個整數,表示所給正整數的乘積的約數之和,答案需對109 7取模。1 n 100,1 ai 2 10 9 326 8題意 求出一些數的乘積的約...
AcWing 871 約數之和
給定n個正整數ai,請你輸出這些數的乘積的約數之和,答案對109 7取模。輸入格式 第一行包含整數n。接下來n行,每行包含乙個整數ai。輸出格式 輸出乙個整數,表示所給正整數的乘積的約數之和,答案需對109 7取模。資料範圍 1 n 100,1 ai 2 109 輸入樣例 32 68輸出樣例 252...