约数之和
#include <bits/stdc++.h>
using namespace std;
const int mod=9901;
int ans=1;
int quick(int a,int b) {
int res = 1;
a=a%mod;
while (b) {
if (b & 1) {
res = res * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return res;
}
int calc(int p,int k) {
if (k == 0) {
return 1;
}
if (k % 2 == 0) {
return (p % mod * calc(p, k - 1) + 1) % mod;
}
return (1 + quick(p, k / 2 + 1)) * calc(p, k / 2) % mod;
}
int main() {
int A, B;
scanf("%d%d", &A, &B);
if (!A) {
printf("0
");
return 0;
}
for (int i = 2; i <= A; i++) {
int k = 0;
while (A % i == 0) {
A = A / i;
k++;
}
if (k) {
ans = ans * calc(i, k * B)%mod;
}
}
printf("%d
",ans);
}
处理阶乘和阶乘的逆元
void init(int n)
{
f[0]=1;
for (int i=1; i<=n; i++)
{
f[i]=f[i-1]*i%mod;
}
inv[n]=quick(f[n],mod-2);
for(int i=n-1; i>=0; i--)
{
inv[i]=inv[i+1]*(i+1)%mod;
}
}
线性求逆元
void get_inv(int n){
inv[1]=1;
for (int i=2;i<=n;i++){
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
}
Lucas
int Lucas(int n,int m){
if (!m){
return 1;
}
return (C(n%p,m%p)*Lucas(n/p.m/p)%p);
}