约数之和
97. 约数之和
题目
提交记录
讨论
题解
假设现在有两个自然数A和B,S是ABAB的所有约数之和。
请你求出S mod 9901的值是多少。
输入格式
在一行中输入用空格隔开的两个整数A和B。
输出格式
输出一个整数,代表S mod 9901的值。
数据范围
0≤A,B≤5×1070≤A,B≤5×107
输入样例:
2 3
输出样例:
15
注意: A和B不会同时为0。
以下为题解
#include<iostream>
using namespace std;
const int mod=9901;
int qmi(int a,int k)
{
a=a%mod;
int res=1;
while(k)
{
if(k&1)res=res*a%mod;
a=a*a%mod;
k>>=1;
}
return res;
}
int sum(int p,int k)
{
//这一部分的推导看题解
if(k==0)return 1;
if(k%2==0) return (1+p%mod*sum(p,k-1))%mod;
return (1+qmi(p,k/2+1)%mod)*sum(p,k/2)%mod;
}
int main()
{
int A,B;
cin>>A>>B;
int res=1;
for(int i=2; i<=A; i++) {
//对A进行质因数分解
int s=0;
while(A%i==0) {
s++;
A/=i;
}
if(s)res=(res%mod*sum(i,s*B))%mod;//当A能对i进行质因数分解时,进行等比数列求和
}
if(!A)res=0;
cout<<res<<endl;
return 0;
}