尽人事,听天命。|

Jerrycyx

园龄:2年9个月粉丝:2关注:1

2024-07-28 00:16阅读: 20评论: 0推荐: 0

Sumdiv - 题解

Sumdiv

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB

描述

假设现在有两个自然数 \(A\)\(B\)\(S\)\(A^B\) 的所有约数之和。
请你求出 \(S \mod 9901\) 的值是多少。

输入描述

在一行中输入用空格隔开的两个整数 \(A\)\(B\)

输出描述

输出一个整数,代表 \(S \mod 9901\) 的值。

用例输入 1

2 3

用例输出 1

15

提示

\(0≤A,B≤5×10^7\)
注意: \(A\)\(B\) 不会同时为 \(0\)

代码

#include<cstdio>
using namespace std;
const long long M=9901;
long long a,b;
long long ans=1;
long long quick_pow(long long x,long long y)
{
long long res=1;
while(y)
{
if(y&1) res=res*x%M;
x=x*x%M;
y>>=1;
}
return res%M;
}
long long solve(long long p,long long k)
{
if(!k) return 1;
if(k&1) return (1+quick_pow(p,(k+1)>>1)) * solve(p,(k-1)>>1)%M;
else return ((1+quick_pow(p,(k>>1)+1)) * solve(p,(k>>1)-1) % M + quick_pow(p,k>>1))%M;
}
int main()
{
scanf("%lld%lld",&a,&b);
if(!a)
{
printf("0\n");
return 0;
}
for(long long i=2;i*i<=a;i++)
{
if(!(a%i))
{
long long cnt=0;
while(!(a%i))
{
a/=i;
cnt++;
}
ans=ans*solve(i,cnt*b)%M;
}
}
if(a>1) ans=(ans*solve(a,b))%M;
printf("%lld\n",ans%M);
return 0;
}
posted @   Jerrycyx  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起