因数分解 (11294767)

因数分解 (11294767)

https://www.nowcoder.com/practice/ecfcba5a9da14f5d82c79ca5727a4113

因数分解 (11294767)

题目链接: https://www.nowcoder.com/practice/ecfcba5a9da14f5d82c79ca5727a4113

题意

给定正整数 ,构造一个数 ,满足:

  1. 的质因数个数(含重复)恰好为 ,且这些质因子之积等于
  2. 最大化 的"优秀因子"数量

优秀因子定义:若 的某个因子能被 的每一个质因子整除,则称为优秀因子。

输出最大优秀因子数量,对 取模。

分析

,其中 为不同的素数,

一个"优秀因子"必须能被所有 整除,即形如 ,其中

因此优秀因子的数量为:

$$

问题转化:将 分拆为若干正整数之和(),最大化这些正整数的乘积。

这是经典的"整数分拆最大化乘积"问题:

  • 不用 1(乘以 1 无贡献)
  • 若某个分量 ,可以拆分:,说明可以继续分
  • 不用大于 4 的分量,尽量用 3

- (9 > 8),所以 3 比 2 更优

- (3 < 4),所以遇到余 1 时,用两个 2 替代一个 3 加一个 1

规律):

  • :答案为
  • :答案为 (拿出 4=2×2,其余用 3)
  • :答案为

特殊情况: 时答案为 (只有 本身一个因子)。

验证样例,答案 ✓(对应 ,分拆为

复杂度

  • 时间复杂度:(快速幂)
  • 空间复杂度:

代码

C++

#include<bits/stdc++.h>
using namespace std;

const long long MOD = 1e9 + 7;

long long power(long long base, long long exp, long long mod) {
    long long result = 1;
    base %= mod;
    while (exp > 0) {
        if (exp & 1) result = result * base % mod;
        base = base * base % mod;
        exp >>= 1;
    }
    return result;
}

int main() {
    int t;
    cin >> t;
    while (t--) {
        long long n;
        cin >> n;
        long long ans;
        if (n == 1) ans = 1;
        else if (n == 2) ans = 2;
        else if (n % 3 == 0) ans = power(3, n/3, MOD);
        else if (n % 3 == 1) ans = 4 * power(3, (n-4)/3, MOD) % MOD;
        else ans = 2 * power(3, (n-2)/3, MOD) % MOD;
        cout << ans << "\n";
    }
    return 0;
}

Java

import java.util.*;
import java.io.*;

public class Main {
    static final long MOD = 1_000_000_007L;

    static long power(long base, long exp, long mod) {
        long result = 1;
        base %= mod;
        while (exp > 0) {
            if ((exp & 1) == 1) result = result * base % mod;
            base = base * base % mod;
            exp >>= 1;
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine().trim());
        StringBuilder sb = new StringBuilder();
        while (t-- > 0) {
            long n = Long.parseLong(br.readLine().trim());
            long ans;
            if (n == 1) ans = 1;
            else if (n == 2) ans = 2;
            else if (n % 3 == 0) ans = power(3, n/3, MOD);
            else if (n % 3 == 1) ans = 4 * power(3, (n-4)/3, MOD) % MOD;
            else ans = 2 * power(3, (n-2)/3, MOD) % MOD;
            sb.append(ans).append('\n');
        }
        System.out.print(sb);
    }
}
全部评论

相关推荐

刚刷到字节跳动官方发的消息,确实被这波阵仗吓了一跳。在大家还在纠结今年行情是不是又“寒冬”的时候,字节直接甩出了史上规模最大的转正实习计划——ByteIntern。咱们直接看几个最硬的数,别被花里胡哨的宣传词绕晕了。首先是“量大”。全球招7000多人是什么概念?这几乎是把很多中型互联网公司的总人数都给招进来了。最关键的是,这次的资源分配非常精准:研发岗给了4800多个Offer,占比直接超过六成。说白了,字节今年还是要死磕技术,尤其是产品和AI领域,这对于咱们写代码的同学来说,绝对是今年最厚的一块肥肉。其次是大家最关心的“转正率”。官方直接白纸黑字写了:整体转正率超过50%。这意味着只要你进去了,不划水、正常干,每两个人里就有一个能直接拿校招Offer。对于2027届(2026年9月到2027年8月毕业)的同学来说,这不仅是实习,这简直就是通往大厂的快捷通道。不过,我也得泼盆冷水。坑位多,不代表门槛低。字节的实习面试出了名的爱考算法和工程实操,尤其是今年重点倾斜AI方向,如果你简历里有和AI相关的项目,优势还是有的。而且,转正率50%也意味着剩下那50%的人是陪跑的,进去之后的考核压力肯定不小。一句话总结:&nbsp;27届的兄弟们,别犹豫了。今年字节这是铁了心要抢提前批的人才,现在投递就是占坑。与其等到明年秋招去千军万马挤独木桥,不如现在进去先占个工位,把转正名额攥在手里。
喵_coding:别逗了 50%转正率 仔细想想 就是转正与不转正
字节7000实习来了,你...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务