试除法判定质数
bool is_prime(int n ){
if(n < 2) return false ;
for(int i = 2 ; i <= n/i ; i ++){
if(n%i == 0) return false ;
}
return true ;
}
分解质因数
void div_prime(int n){
for(int i = 2 ; i <= n /i ; i ++){
int s = 0 ;
while(n % i == 0 ){
n /= i ;
s++ ;
}
if(s) printf("%d %d\n" ,i ,s );
}
if(n != 1){
printf("%d %d\n" ,n ,1 );
}
}
质数线性筛
int prime[N] , cnt ;
bool vis[N] ;
void get_prime(int n) {
for(int i = 2 ; i <= n ; i ++){
if(!vis[i]) prime[++cnt] = i ;
for(int j = 1 ; prime[j] <= n/i ; j ++){
vis[prime[j] * i] = true ;
if(i % prime[j] == 0 ) break ;
}
}
}
试除法求约数
vector<int> get_div(int n) {
vector<int > res ;
for(int i = 1 ; i <= n / i ; i ++ ){
if(n%i == 0){
res.push_back(i) ;
if(i != n / i ) res.push_back(n/i) ;
}
}
sort(res.begin() , res.end());
return res ;
}
约数个数(含证明)
我们将一个数分解质因数后,可得:
n
=
p
1
a
1
×
p
2
a
2
×
.
.
.
.
.
.
×
p
k
a
k
n = p_{1}^{a_{1}}\times p_{2}^{a_{2}}\times ......\times p_{k}^{a_{k}}
n=p1a1×p2a2×......×pkak
易知,n的所有因数都可由n的若干质因数和1组合而成,所以所有的因数个数是:
(
a
1
+
1
)
×
(
a
2
+
1
)
×
.
.
.
.
.
.
×
(
a
k
+
1
)
(a_{1}+1)\times(a_{2}+1)\times......\times(a_{k}+1)
(a1+1)×(a2+1)×......×(ak+1)
#include <iostream>
#include <unordered_map>
using namespace std ;
typedef long long ll ;
ll mod = 1e9 + 7;
unordered_map<int ,int > map ;
void div_prime(int n){
for(int i = 2 ; i <= n /i ; i ++){
while(n%i == 0 ){
n /= i ;
map[i] ++ ;
}
}
if(n != 1){
map[n] ++ ;
}
}
int main(){
int n ;
cin >> n ;
for(int i = 1 ; i <= n ; i ++ ){
int a ;
cin >> a ;
div_prime(a);
}
ll res = 1 ;
for(auto t : map) res = res*(t.second+1)%mod ;
cout << res << endl ;
return 0 ;
}
约数之和
约数之和等于
(
p
1
0
+
p
1
1
+
.
.
.
.
.
.
+
p
1
a
1
)
×
(
p
2
0
+
p
2
1
+
.
.
.
.
.
.
+
p
2
a
2
)
×
.
.
.
.
.
.
.
×
(
p
k
0
+
p
k
1
+
.
.
.
.
.
.
+
p
k
a
k
)
(p_{1}^{0} + p_{1}^{1} + ......+p_{1}^{a_{1}})\times(p_{2}^{0} + p_{2}^{1} + ......+p_{2}^{a_{2}})\times.......\times(p_{k}^{0} + p_{k}^{1} + ......+p_{k}^{a_{k}})
(p10+p11+......+p1a1)×(p20+p21+......+p2a2)×.......×(pk0+pk1+......+pkak)
#include <iostream>
#include <cstring>
#include <unordered_map>
#define debug(x) cerr << #x << " : " << x << endl
using namespace std ;
const int mod = 1e9 + 7;
int main(){
int n ;
cin >> n ;
unordered_map<int ,int > map ;
while(n -- ){
int a ;
cin >> a ;
// debug(a) ;
// debug(n) ;
for(int i = 2 ; i <= a/i ; i ++){
while(a%i == 0 ){
a /= i ;
map[i] ++ ;
}
}
if(a > 1 ) map[a] ++ ;
}
long long ans = 1 ;
for(auto t : map){
int a = t.first , b = t.second ;
// debug(a);
// debug(b);
long long p = 1 ;
while(b --) p = (p*a + 1)%mod ;
ans = (ans * p)%mod ;
}
cout << ans << endl ;
return 0 ;
}