对任意一个数N,d是N的一个约数,他们可以写成下列格式
约数个数就转化为等于每个因子有多少种选法
在int范围内,约数最多的数有大概1500个约数。
代码实现
//先对a1, a2,,...an 分别分解,再套用公式
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int mod = 1e9 + 7;
unordered_map<int, int > table;
int n;
int main(){
cin >> n;
while( n --){
int x;
cin >> x;
for(int i = 2; i <= x / i; i++){
if(x % i == 0){
while(x % i == 0){
table[i] ++;
x /= i;
}
}
}
if(x > 1) table[x] ++;
}
long long res = 1;
for(auto i:table){
res = res * (i.second + 1) % mod;
}
cout << res << endl;
return 0;
}
约数之和 等于
//先对a1, a2,,...an 分别分解,再套用公式
#include<iostream>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int mod = 1e9 + 7;
unordered_map<int, int > table;
int n;
int main(){
cin >> n;
while( n --){
int x;
cin >> x;
for(int i = 2; i <= x / i; i++){
if(x % i == 0){
while(x % i == 0){
table[i] ++;
x /= i;
}
}
}
if(x > 1) table[x] ++;
}
long long res = 1;
for(auto i:table){
int num = i.second, t = i.first;
long long sum = 1; //记录对一个约数的等比数项的和。(p1^0 + p1^1 + p1^2 + p1^a1)的和
for(int j = 1; j <= num; j++){
sum =( sum * t + 1) % mod;
}
res = res * sum % mod;
}
cout << res << endl;
return 0;
}