AcWing 870. 约数个数
由于我是我们队的数论选手,寒假刷题会略偏向于数论方面QWQ,在此记录 2021-01-12 刷题打卡~
思路分析:
任何正整数可以表示为 N = P1 ^ α1 * P2 ^ α2 * P3 ^ α3 * … * Pk ^ αk (P为质数)
则该数N所拥有的约数个数为 (α1 +1)* (α2 +1) * (α3 +1) *… * (αk +1)
AC代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int mod = 1e9 + 7;
unordered_map<int,int> primes;
int main() {
int n;
cin >> n;
while(n--) {
int x;
cin >> x;
// 试除法筛质数
for(int i = 2; i <= x / i; i++) {
while (x % i == 0) {
x /= i;
primes[i]++;
}
}
// 避免存在一个大于 sqrt(x) 的约数
if(x > 1)
primes[x]++;
}
ll res = 1;
// 根据前面的结论,遍历hashmap,然后得出答案
for(auto prime : primes)
res = res * (prime.second + 1) % mod;
cout << res << endl;
return 0;
}
最后补两个东西
关联容器:unordered_map详细介绍(附可运行代码)
c++中map与unordered_map的区别