式子需要自己手推一遍,另外快速幂日常%不能忘
#include<cstdio>
#include<iostream>
using namespace std;
#define int long long
const long long MOD=9901;
//快速幂 a^x
int ksm(int a,int x){
int sum=1;
while(x){
if(x&1){
sum=(sum%MOD)*(a%MOD);
}
a=(a%MOD)*(a%MOD);
x>>=1;
}
return sum%MOD;
}
int p[100000],c[100000];
//质因数分解
//@return 质因子数量
int divide(int x){
int m=0;
for(int i=2;i*i<=x;i++){
if(!(x%i)){
p[++m]=i;
while(!(x%i)){
x/=i;
c[m]++;
}
}
}
if(x!=1){
p[++m]=x;
c[m]=1;
}
return m;
}
/**
* 解决1+p+...+p^c
* @p 质因子
* @nowC 当前的最大c
*/
int solve1(int p,int nowC){
if(!nowC)return 1;
if(nowC%2){//奇数
int tmp=1+ksm(p,(nowC+1)/2);
tmp=tmp%MOD;
int tmp2=solve1(p,(nowC-1)/2);
tmp2=tmp2%MOD;
return tmp*tmp2;
}else{
int tmp=1+ksm(p,(nowC/2)+1);
tmp=tmp%MOD;
int tmp2=solve1(p,(nowC/2)-1);
tmp2=tmp2%MOD;
int tmp3=tmp*tmp2;
tmp3=tmp3%MOD;
int tmp4=tmp3+ksm(p,nowC/2);
tmp4=tmp4%MOD;
return tmp4;
}
}
signed main(){
int a,b;
scanf("%lld%lld",&a,&b);
if(a==0){
cout<<0<<endl;
return 0;
}
int num=divide(a);
int ans=1;
for(int i=1;i<=num;i++){
//cout<<p[i]<<" "<<c[i]<<endl;
c[i]*=b;
int tmp=solve1(p[i],c[i]);
ans=ans*tmp;
ans=ans%MOD;
}
cout<<ans<<endl;
return 0;
}