问题链接:POJ1845 Sumdiv。
问题简述:参见上述链接。
问题分析:计算a^b的因子数,首先要对a进行因子分解,然后再进行计算。
程序说明:计算过程中用到了快速模幂函数。
题记:(略)
AC的C++语言程序如下:
/* POJ1845 Sumdiv */
#include <iostream>
using namespace std;
const int MOD = 9901;
const int N = 1000;
int fact[N+1], e[N+1], fcount;
void setfact(int n)
{
fcount = 0;
if(n && n % 2 == 0) {
fact[fcount] = 2;
e[fcount] = 0;
while(n && n % 2 == 0) {
e[fcount]++;
n /= 2;
}
fcount++;
}
for(int i=3; i*i <=n; i+=2) {
if(n % i == 0) {
fact[fcount] = i;
e[fcount] = 0;
while(n && n % i == 0) {
e[fcount]++;
n /= i;
}
fcount++;
}
}
if(n != 1) {
fact[fcount] = n;
e[fcount] = 1;
fcount++;
}
}
// 快速模幂计算函数
long long powermod(long long a, long long n, int m)
{
long long res = 1;
while(n) {
if(n & 1) { // n % 2 == 1
res *= a;
res %= m;
}
a *= a;
a %= m;
n >>= 1;
}
return res;
}
//递归二分求 (1 + p + p^2 + p^3 +...+ p^n)%mod
long long sum(long long p, long long n)
{
if(n==0)
return 1;
else if(n % 2)
// 奇数:(1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))
return (sum(p, n / 2) * (1 + powermod(p, n/2+1, MOD))) % MOD;
else
// 偶数:(1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2)
return (sum(p, n / 2 - 1) * (1 + powermod(p, n / 2 + 1, MOD)) + powermod(p, n / 2, MOD)) % MOD;
}
int main()
{
int a, b, ans;
while(cin >> a >> b) {
setfact(a);
ans = 1;
for(int i=0; i<fcount; i++)
ans = (ans * (sum(fact[i], e[i] * b ) % MOD)) % MOD;
cout << ans << endl;
}
return 0;
}