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 @ 2024-07-28 00:16  Jerrycyx  阅读(105)  评论(0)    收藏  举报