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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步