ZT40 小苯的数字权值

描述

小苯定义一个数字的权值为:该数字的因子个数。
小苯现在拿到了一个正整数 x,他希望将 x 分解为若干不等于 1 的数字(也可以不做分解),使得所有分解出的正整数乘积等于 x,且所有数字的权值之和尽可能大,你能帮帮他求出最大的权值吗。

输入描述:

输入包含 T+1 行。
第一行一个正整数 T (1≤T≤10^4),表示数据组数。
接下来 T 行,每行一个正整数 x (2≤x≤2×10^5),表示每组数据中小苯询问的数字 x。

输出描述:

输出包含 T 行,每行一个正整数表示每组测试数据的最大权值和。

示例1

输入:

3
2
10
123

输出:

2
4
4

说明:

第一个测试数据中,无法分解,直接取 2 的权值为 2。
第二个测试数据中,将 10 分解为 2×5,权值和为 4。
一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.给定T组数据

2.每组数据包含一个正整数x

3.求x的权值,

4.权值的意思应该就是x存在的因子的个数

二、解题思路

1.还不太明白

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <math.h>

#define N 300010
#define M 1010
int a[N];

void solve() {
    int x;
    scanf("%d", &x);
    int maxx = 0;
    int sum = 1;
    for (int i = 2; i * i <= x; i++) {
        if (x % i == 0) {
            int cnt = 0;
            while (x % i == 0) {
                x /= i;
                cnt++;
            }
            sum *= (cnt + 1);
            maxx = (maxx > cnt * 2)? maxx : cnt * 2;
        }
    }
    if (x > 1) {
        maxx = (maxx > 2)? maxx : 2;
        sum *= 2;
    }
    printf("%d\n", (maxx > sum)? maxx : sum);
}

int main() {
    int _;
    scanf("%d", &_);
    while (_--) {
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingw0114

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值