题解 | #小苯的数字权值#
小苯的数字权值
https://www.nowcoder.com/practice/aeacca655eec45999a6dc4d998dfd4a5
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <stack>
#include <numeric>
#include <ctime>
#include <string>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
using namespace std;
using ll = long long;
const ll N = 2e5 + 5, mod = 1e9 + 7, inf = 2e18;
int x;
vector<int>a;
vector<int> find(int n) {
vector<bool> vis(n + 5, false);
vector<int>ans;
for (int i = 2; i * i <= n; i++) {
if (!vis[i]) {
for (int j = i * i; j <= n; j += i) {
vis[j] = true;
}
}
}
for (int i = 2; i <= n; i++) {
if (!vis[i]) {
ans.push_back(i);
}
}
return ans;
}
bool check(int n) {
if (n == 1)return false;
if (n == 2)return true;
if (n % 2 == 0)return false;
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0)return false;
}
return true;
}
void solve() {
cin >> x;
if (check(x)) {
cout << 2 << '\n';
return ;
}
map<int, int>mp;
for (auto i : a) {
while (x % i == 0) {
mp[i]++;
x /= i;
}
}
if (mp.size() == 1) {
cout << mp.begin()->second * 2 << '\n';
return ;
}
int ans = 1;
for (auto [p, q] : mp) {
ans *= q + 1;
}
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
a = find(2e5 + 5);
while (t--) {
solve();
}
return 0;
}
