#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod = 1e9 +7;
int main(){
int n;
cin >> n;
unordered_map<int, int> primes;
while(n --){
int x;
cin >> x;
for(int i = 2; i <= x / i; i ++){
while(x % i == 0) {
x /= i;
primes[i] ++ ;
}
}
if(x > 1) primes[x] ++ ;
}
LL res = 1;
for(auto prime : primes) res = res * (prime.second + 1) % mod;
cout << res;
}
约数之和
这个求和其实我感觉很妙
就是我们上面不是得到了约数之和吗,然后我们还拿这个12来看
12 = 2 × 2 × 3 = 2² × 3¹
约数为 1 2 3 4 6 12 ,那么和就是28了
我们还可以发现(1 + 2 + 4) * (1 + 3)= 28
然后我们的结论就是求出质因数的和然后相乘,就是下面这一步
cpp复制代码
int p = prime.first, a = prime.second;
LL t = 1;
while(a --){
t = (t * p + 1) % mod;
}
cpp复制代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod = 1e9 +7;
int main(){
int n;
cin >> n;
unordered_map<int, int> primes;
while(n --){
int x;
cin >> x;
for(int i = 2; i <= x / i; i ++){
while(x % i == 0) {
x /= i;
primes[i] ++ ;
}
}
if(x > 1) primes[x] ++ ;
}
LL res = 1;
for(auto prime : primes){
int p = prime.first, a = prime.second;
LL t = 1;
while(a --){
t = (t * p + 1) % mod;
}
res = res * t % mod;
}
cout << res;
}
欧几里得算法
就是求最大公约数,这个大家都会就不详细说明了,就是辗转相除法,当b=0时候,就直接返回a的值就行
cpp复制代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int mod = 1e9 +7;
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
int main(){
int n;
scanf("%d", &n);
while(n --){
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", gcd(a, b));
}
}