题目链接:poj 1845
给定a,b两个数,求a^b的所有约数之和对9901取模
a=(p1^n1)*(p2^n2)*(p3^n3)*……
a的约数之和为(1+p1+p1^2+......+p1^n1)*(1+p2+p2^2+......+p2^n2)*......
利用矩阵快速幂求得幂次求和
/******************************************************
* File Name: 1845.cpp
* Author: kojimai
* Creater Time:2014年08月16日 星期六 20时59分47秒
******************************************************/
/*
* a=(p1^n1)*(p2^n2)*(p3^n3)...
**a的约数之和为(1+p1+p1^2+...+p1^n1)*(1+p2+p2^2+...+p2^n2)*...
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
#define mod 9901
struct node
{
long long num[2][2];
};
node mul(node a,node b)
{
node ret;
for(int i=0;i<2;i++)
{
for(int j=0;j<2;j++)
{
ret.num[i][j]=0;
for(int k=0;k<2;k++)
{
ret.num[i][j]=(ret.num[i][j]+a.num[i][k]*b.num[k][j])%mod;
}
}
}
return ret;
}
long long qpow(long long x,long long y)
{
if(y==0)
return 1;
node ret={
1,0,0,1
};
node tmp={x,x,0,1};
while(y)
{
if(y%2==1)
ret=mul(ret,tmp);
y/=2;
tmp=mul(tmp,tmp);
}
return (ret.num[0][1]+1)%mod;
}
int main()
{
long long a,b;
while(cin>>a>>b)
{
if(a==0)
{
cout<<0<<endl;
continue;
}
long long ans=1;
for(long long i=2;i*i<=a;i+=2)
{
if(a%i==0)
{
long long cnt=0;
while(a%i==0)
{
a/=i;
cnt++;
}
ans=(ans*qpow(i,b*cnt))%mod;
}
if(i==2)
i--;
}
if(a!=1)
ans=(ans*qpow(a,b))%mod;
cout<<ans<<endl;
}
return 0;
}