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;
}
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/18327752

浙公网安备 33010602011771号