算法竞赛进阶指南:0x02递推与递归:分治:Sumdiv
作者:互联网
题目位置:https://www.acwing.com/problem/content/99/
借鉴:https://www.acwing.com/solution/content/30343/
题目:假设现在有两个自然数 A 和 B,S 是的所有约数之和。请你求出 S mod 9901的值是多少。
#include<iostream>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod=9901;
int a,b;
unordered_map<int,int>primes;
//快速幂
int poww(int x,int y)
{
int ans=1;
while(y)
{
if(y&1)ans=(LL)ans*x%mod;
y>>=1;
x=(LL)x*x%mod;
}
return ans;
}
//分解质因子
void divide(int n)
{
for(int i=2; i<=n/i; i++)
if(n%i==0)
while(n%i==0)
{
n/=i;
primes[i]++;
}
if(n>1)primes[n]++;
}
//核心
int sum(int p,int c)
{
if(c==0)return 1;//递归结束条件
if(c%2)
return (LL)(1+ poww(p, (c+1)/2 ) ) * sum(p , (c-1)/2 )%mod;
else
return ((LL)(1 + poww(p, c/2 ) )*sum(p,c/2-1) + poww(p,c) )%mod;
}
int main()
{
cin>>a>>b;
divide(a);
int ans=1;
for(auto it:primes)
{
int p=it.first,c=it.second*b;
ans=(LL)ans*sum(p,c)%mod;
}
if(a==0)ans=0;
cout<<ans<<endl;
return 0;
}
标签:return,进阶,int,LL,Sumdiv,poww,0x02,ans,mod 来源: https://blog.csdn.net/weixin_66182206/article/details/123607616