题解 | #小苯的数字权值#

假设 表示质因子 的数量,定义 为一个数拆成其全部质因子的权值,定义 为一个数不拆情况下的权值,也就是一个数的因子数量,一个数因子的数量是其每个质因子数量加一的乘积,如何证明?举个例 ,而 12 的因子其实就是在修改等式右边的指数,每个数 的指数的取值范围是 ,指数为几就代表选择了几个这个质因子,最后乘积一定是 12 的一个因子,现在我们来分类讨论不同情况

当一个数只有一个质因子

很明显无论 是多少都应该选 也就是拆开

当一个数有多个质因子时

显然这时乘法一定优于加法,选择 也就是不拆

同时观察这个题,t 比较大,所以可以先预处理出所有的质数,然后维护出每个数的质因子即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
int __t = 1, n, a[N];
vector<int> v;
void solve() {
    cin >> n;
    map<int, int> mp;
    for (auto i : v) {
        while (n % i == 0) {
            mp[i]++;
            n /= i;
        }
        if (n == 1)
            break;
    }
    if (mp.size() == 1) {
        cout << mp.begin()->second * 2 << '\n';
    } else {
        int ans = 1;
        for (auto [x, y] : mp) {
            ans *= y + 1;
        }
        cout << ans << '\n';
    }
    return;
}
int32_t main() {
#ifdef ONLINE_JUDGE
    ios::sync_with_stdio(false);
    cin.tie(0);
#endif
    for (int i = 2; i < N; i++)
        if (a[i] == 0) {
            v.push_back(i);
            for (int j = i * 2; j < N; j += i)
                a[j] = 1;
        }
    cin >> __t;
    while (__t--)
        solve();
    return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
评论
6
收藏
分享
牛客网
牛客企业服务