题目位置: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; }