题意两个数A和B。让S等于 $math_inline$A^B$math_inline$ 的所有因子的和,输出S%9901
由分解素因数可知 $math_inline$A=p_1^{a_1}p_2^{a_2}...p_k^{a_k}$math_inline$
那么 $math_inline$A^B=p_1^{a_1B}p_2^{a_2B}...p_k^{a_kB}$math_inline$
那么 $math_inline$S=(1+p_1+p_1^2+...+p_1^{a_1B})\times(1+p_2+p_2^2+...+p_2^{a_2B})\times...\times(1+p_k+p_k^2+...+p_k^{a_kB})$math_inline$
对等比数列求和可得: $math_inline$S=\frac{p_1^{a_1B+1}-1}{p_1-1}\times\frac{p_2^{a_2B+1}-1}{p_2-1}\times ... \frac{p_k^{a_kB+1}-1}{p_k-1}$math_inline$
由于有取余操作,那么我们可以通过逆元快速求得每一个分式取余mod的结果
求逆元一般公式(条件b|a): $math_inline$ANS=\frac{a}{b}\text{mod}m=\frac{a\text{mod}(mb)}{b}$math_inline$
Code
/**
* author: Akvicor
* created: 2019-08-02 10-38-51
**/
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <bitset>
#include <complex>
#include <cstdlib>
#include <cmath>
#include <set>
#include <list>
#include <deque>
#include <map>
#include <queue>
using namespace std;
#ifdef DEBUG
#define FAST_IO 17
#else
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define endl '\n'
#endif
#define rep(i, n) for(int i = 0; i < (n); ++i)
#define reep(i, n) for(int i = 0; i <= (n); ++i)
#define lop(i, a, n) for(int i = a; i < (n); ++i)
#define loop(i, a, n) for(int i = a; i <= (n); ++i)
#define per(i, a, n) for(int i = a; i >= n; --i)
#define prec(x) fixed << setprecision(x)
#define ms(s, n) memset(s, n, sizeof(s))
#define all(v) (v).begin(), (v).end()
#define sz(x) ((int)(x).size())
#define mp(x, y) make_pair(x, y)
#define pb(x) push_back(x)
#define fi first
#define se second
#define MOD(x) const int MOD = (int)x
#define MAXN(x) const int MAXN = (int)x + 10
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<LL, LL> PLL;
typedef vector<LL> VL;
typedef vector<PLL> VLL;
const double EPS = 1e-6;
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const LL LINF = 0x7f7f7f7f7f7f7f7f;
namespace SOL{
/** >------- Akvicor's Solution -------< **/
MOD(9901);
MAXN(1e4);
LL a, b;
bool prime[MAXN];
int p[MAXN];
int cnt;
LL mult_mod(LL a, LL b, LL m){
a %= m;
b %= m;
LL ret = 0;
LL tmp = a;
while(b){
if(b&1){
ret += tmp;
if(ret > m) ret -= m;
}
tmp <<= 1;
if(tmp > m) tmp -= m;
b >>= 1;
}
return ret;
}
LL quick_mod(LL a, LL n, LL mod){
LL ret = 1;
LL temp = a % mod;
while(n){
if(n & 1) ret = mult_mod(ret, temp, mod);
temp = mult_mod(temp, temp, mod);
n >>= 1;
}
return ret;
}
void isprime(){
cnt = 0;
ms(prime, true);
for(int i = 2; i < MAXN; ++i){
if(prime[i]){
p[cnt++] = i;
for(int j = i+i; j < MAXN; j += i)
prime[j] = false;
}
}
}
void solve(){
FAST_IO;
cin >> a >> b;
isprime();
LL ans = 1;
for(int i = 0; p[i]*p[i] <= a; ++i){
if(a % p[i] == 0){
LL num = 0;
while(a % p[i] == 0){
++num;
a /= p[i];
}
LL M = (p[i] - 1) * MOD;
ans *= (quick_mod(p[i], num*b+1, M) - 1) / (p[i]-1);
ans %= MOD;
}
}
if(a > 1){
LL M = (a - 1) * MOD;
ans *= (quick_mod(a, b+1, M) - 1) / (a-1);
ans %= MOD;
}
cout << ans << endl;
}
/** >----------------------------------< **/
}
int main(){
#ifdef DEBUG
int DEBUGCNT = 0;
clock_t DEBUGstart, DEBUGfinish;
double DEBUGduration;
cout << endl << ">------- Akvicor's Solution -------<" << endl << endl;
while (DEBUGCNT < 70) {
cout << ">---> Test: #" << DEBUGCNT << " <---<" << endl;
DEBUGstart = clock();
#endif
SOL::solve();
#ifdef DEBUG
DEBUGfinish = clock();
DEBUGduration = (double)(DEBUGfinish - DEBUGstart)*1000 / CLOCKS_PER_SEC;
cout << ">---> Test: #" << DEBUGCNT << " time: " << fixed << setprecision(4) << DEBUGduration << " ms <---<" << endl << endl;
if (cin.eof()) break;
if (!cin.good()) break;
if (cin.fail()) break;
if (cin.bad()) break;
++DEBUGCNT;
}
cout << ">----------------------------------<" << endl << endl;
#endif
return 0;
}