给一个数n,求它的约数个数
因为n可以唯一分解成质因数的乘积即(n = p_1^{alpha1}p_2^{alpha2}...p_t^{alpha t}),所以n的约数c的形式应该是(c= p_1^{eta1}p_2^{eta2}...p_t^{eta t}),对于任何两组不同的(eta 1,...,eta t)的取值,由算数基本定理得c是不同的,由于(eta i)的取值为(0,1,...,alpha i)共((alpha i + 1))种,所以由乘法原理得:n约数个数为((alpha 1 + 1) imes...(alpha t + 1)).
给定n个正整数ai,请你输出这些数的乘积的约数个数,答案对1e9+7取模。
#include<iostream>
#include<unordered_map>
using namespace std;
#define LL long long
const int mod = 1e9 + 7;
int n;
unordered_map<int, int> primes;
int main(){
cin >> n;
while(n --){
int a;
cin >> a;
for(int i = 2; i <= a / i; i ++)
if(a % i == 0)
while(a % i == 0){
a /= i;
primes[i] ++;
}
if(a > 1) primes[a] ++;
}
LL res = 1;
for(auto t : primes) res = res * (t.second + 1) % mod;
cout << res;
return 0;
}
给一个数n,求它的约数之和
公式:(sum = (p_1^{0}+p_1^{1}+...+p_1^{alpha1}) imes...(p_t^{0}+p_t^{1}+...+p_t^{alpha t})),把右侧展开,共有((alpha 1 + 1) imes...(alpha t + 1))项相加,并且每一项都是一个约数。
给定n个正整数ai,请你输出这些数的乘积的约数之和,答案对1e9 + 7取模。
#include<iostream>
#include<unordered_map>
using namespace std;
#define LL long long
const int mod = 1e9 + 7;
int n;
unordered_map<int, int> primes;
int main(){
cin >> n;
while(n --){
int a;
cin >> a;
for(int i = 2; i <= a / i; i ++)
if(a % i == 0)
while(a % i == 0){
a /= i;
primes[i] ++;
}
if(a > 1) primes[a] ++;
}
LL res = 1;
for(auto prime : primes){
int a = prime.first, b = prime.second; // a为底数,b为指数
LL t = 1;
while(b --) t = (t * a + 1) % mod;
res = res * t % mod;
}
cout << res;
return 0;
}
代码里有一个计算(1 + p^1 + p^2 + p^3 +… + p^a)多项式的技巧:
res = 1
for(int i = 1; i <= a; i ++) res = res * p + 1;