题目
假设现在有两个自然数A和B,S是A的B次方的所有约数之和。
请你求出S mod 9901的值是多少。
输入格式
在一行中输入用空格隔开的两个整数A和B。
输出格式
输出一个整数,代表S mod 9901的值。
数据范围
0≤A,B≤5×10^7
输入样例:
2 3
输出样例:
15
题解
附上李煜东 算法竞赛进阶指南书上的题解
代码
#include<iostream>
using namespace std;
const int mod=9901;
int ksm(int a,int b){
a%=mod;
int ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int sum(int q,int k){
if(k==0) return 1;
if(k%2==0) return (q%mod*sum(q,k-1)+1)%mod;
return (1+ksm(q,k/2+1))*sum(q,k/2)%mod;
}
int main(){
int a,b;
cin>>a>>b;
if(a==0){
cout<<0<<endl;
return 0;
}
int ans=1;
for(int i=2;i<=a;i++){
int cnt=0;
while(a%i==0){
cnt++;
a/=i;
}
ans=ans*sum(i,cnt*b)%mod;
}
cout<<ans<<endl;
return 0;
}