假设现在有两个自然数 A和 B,S 是 AB 的所有约数之和。
请你求出 𝑆 mod 9901 的值是多少。
输入格式
在一行中输入用空格隔开的两个整数 A 和 B。
输出格式
输出一个整数,代表 𝑆 mod 9901 的值。
数据范围
0≤𝐴,𝐵≤5×107
输入样例:
2 3
输出样例:
15
注意: A 和 B 不会同时为 0。
思路:
这里我用的是等比数列求和,有一个关键就是公比为1的特殊情况需要考虑。循环找到a的素因子,指数乘b就是该素因子的最大指数。再根据约数求和公式。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=9901;
int a,b;
int pw(int x,int n){
int ans=1;
while(n){
if(n&1)ans=(x*ans)%mod;
x=(x*x)%mod;
n=n>>1;
}
return ans;
}
void extend_gcd(int a,int b,int &x,int &y){
if(b==0){
x=1;
y=0;
return ;
}
extend_gcd(b,a%b,x,y);
int tmp=x;
x=y;
y=tmp-(a/b)*y;
}
int mod_inverse(int a,int m){
int x,y;
extend_gcd(a,m,x,y);
return (m+x%m)%m;
}
int run(int x,int b){
if(x%mod==1){
return (b+1)*1;
}
int f=(pw(x,b+1)-1);
int g=(x-1);
int k=mod_inverse(g,mod);
return (f*k)%mod;
}
bool pm(int x){
for(int i=2;i<=sqrt(x);i++)
if(x%i==0)return false;
return true;
}
signed main(){
cin>>a>>b;
int ans=1;
if(a==0){
cout<<0;
return 0;
}else if(b==0){
cout<<1;
return 0;
}
for(int i=2;i<=a;i++)
if(a%i==0){
int s=0;
while(a%i==0){
a=a/i;
s++;
}
s=s*b;
ans=(ans*run(i,s))%mod;
}
cout<<(mod+ans)%mod;
return 0;
}