约数个数 & 约数之和 https://www.acwing.com/problem/content/3380/
/*
【约数个数】count = ∏(质因数的指数+1)
【约数之和】 sum = ∏(质因数^0 + …… + 质因数^质因数的指数)
*/
#include<bits/stdc++.h>
using namespace std;
//计算 质因数^0 + …… + 质因数^质因数的指数
int func(int a, int b){
int sum=0;
for(int i=0;i<=b;i++){
// sum += pow(a,b); × !!!
sum += pow(a,i);
}
return sum;
}
int main(){
int n;
cin>>n;
unordered_map<int,int> um; //无序map(哈希map): 【key:value】
//【分解质因数】—— 性质: 任何合数 都可拆解为 质数之积
// 求得 n所有的 【质因数】:【指数】
for(int i=2;i<=n;i++){
while(n%i==0){
um[i]++; //key=i【质因数】对应的value【指数】++
n = n/i; //更新n
}
}
//(一)【约数个数】————————————————————————————————————————————————————————
int count=1; //因为要累乘————>初始化为1
//累乘(质因数的指数+1)————> 循环
for(auto item:um){ // 每个键值对 .first————key(底数) .second————value(指数)
count *= (item.second + 1); // 不要漏掉括号!!!
}
cout<<count<<endl;
//(二)【约数之和】————————————————————————————————————————————————————————
int sum=1; //因为要累乘————>初始化为1;
//累乘(质因数^0 + …… + 质因数^质因数的指数)————> 循环
for(auto item:um){ // 每个键值对 .first————key(底数) .second————value(指数)
sum *= func(item.first, item.second); // 需封装func函数计算
}
cout<<sum<<endl;
return 0;
}
/* ERROR
(一)sum += pow(a,b); for循环i,b应该为i
(二)因为count和sum都要累乘操作————>应初始化为1!!!
*/