蓝桥集训之约数之和
-
核心思想:快速幂 + 数学公式递归
- 奇数: pk-1 + sum(p,k-1) p0 + p1 +…+ pk-2;
- 偶数:(pk/2 + 1) * sum(p,k/2)
-
#include<iostream> #include<unordered_map> using namespace std; typedef long long LL; const int mod = 9901; unordered_map<int,int> primes; int a,b; void divide(int n) //求质因数 { for(int i=2;i<n/i;i++) { if(n%i == 0) { while(n%i==0) { primes[i] ++; n /= i; } } } if(n>1) primes[n] ++; } int qmi(int a,int b) //快速幂 { int res=1; while(b) { if(b & 1) res = (LL)res * a % mod; a = (LL)a * a % mod; b >>= 1; } return res; } int sum(int p,int k) { if(k == 1) return 1; if(k % 2 == 0) { return (LL)(qmi(p,k/2) +1) * sum(p,k/2) % mod; } return (qmi(p,k-1) + sum(p,k-1)) %mod; } int main() { cin>>a>>b; divide(a); int res = 1; for(auto prime : primes) { int p = prime.first , k = prime.second * b; //每个质因数都要求一次 res = (LL)res * sum(p,k+1) %mod; } if(!a) res = 0; cout<<res; }