博客
关于我
codeforces1033D 2000分数学
阅读量:294 次
发布时间:2019-03-03

本文共 3584 字,大约阅读时间需要 11 分钟。

为了求解问题,我们首先分析每个数a_i的质因数分解情况,然后将它们相乘得到sum,最后计算sum的约数个数。具体步骤如下:

  • 分析每个a_i的质因数分解

    • 检查a_i是否为某个数的四次方、立方或平方。若不是,则判断其是否是两个不同质数的乘积。
    • 根据判断结果,记录对应的质因数及其指数。
  • 累加质因数指数

    • 对于每个质因数,将其在sum中的总指数累加。
  • 计算约数个数

    • 将sum的质因数分解中的每个指数加1,相乘得到约数个数。
  • 通过上述步骤,可以高效地计算出sum的约数个数,并对结果取模。

    代码实现

    #include 
    using namespace std;
    const ll mod = 998244353;
    const int maxn = 1e4 + 5;
    const double eps = 1e-6;
    int n;
    int cnt = 0, cur = 0;
    ll ans = 1;
    struct node {
    ll x, num;
    } a[MAXN];
    struct prime {
    ll x, num;
    } p[MAXN];
    ll four(ll x) {
    ll y = pow(x, 1.0 / 4) + eps;
    if (y * y * y * y == x) {
    bool flag = 0;
    for (int i = 1; i <= cnt; i++) {
    if (y == p[i].x) {
    flag = 1;
    p[i].num += 4;
    break;
    }
    }
    if (!flag) {
    p[++cnt].x = y;
    p[cnt].num = 4;
    }
    return 1;
    }
    return 0;
    }
    ll three(ll x) {
    ll y = pow(x, 1.0 / 3) + eps;
    if (y * y * y == x) {
    bool flag = 0;
    for (int i = 1; i <= cnt; i++) {
    if (y == p[i].x) {
    flag = 1;
    p[i].num += 3;
    break;
    }
    }
    if (!flag) {
    p[++cnt].x = y;
    p[cnt].num = 3;
    }
    return 1;
    }
    return 0;
    }
    ll two(ll x) {
    ll y = pow(x, 1.0 / 2) + eps;
    if (y * y == x) {
    bool flag = 0;
    for (int i = 1; i <= cnt; i++) {
    if (y == p[i].x) {
    flag = 1;
    p[i].num += 2;
    break;
    }
    }
    if (!flag) {
    p[++cnt].x = y;
    p[cnt].num = 2;
    }
    return 1;
    }
    return 0;
    }
    void add_a(ll x, ll num) {
    bool flag = 0;
    for (int i = 1; i <= cur; i++) {
    if (x == a[i].x) {
    flag = 1;
    a[i].num += num;
    break;
    }
    }
    if (!flag) {
    a[++cur].x = x;
    a[cur].num = num;
    }
    }
    void add_p(ll x, ll num) {
    bool flag = 0;
    for (int i = 1; i <= cnt; i++) {
    if (x == p[i].x) {
    flag = 1;
    p[i].num += num;
    break;
    }
    }
    if (!flag) {
    p[++cnt].x = x;
    p[cnt].num += num;
    }
    }
    void try1(int i) {
    bool flag = 0;
    for (int j = i + 1; j <= cur; j++) {
    ll y = __gcd(a[i].x, a[j].x);
    if (y > 1) {
    flag = 1;
    add_p(y, a[i].num);
    add_p(a[i].x / y, a[i].num);
    break;
    }
    }
    if (!flag) {
    ans *= (a[i].num + 1);
    ans %= mod;
    ans *= (a[i].num + 1);
    ans %= mod;
    }
    }
    void solve() {
    for (int i = 1; i <= cur; i++) {
    bool flag = 0;
    for (int j = 1; j <= cnt; j++) {
    if (a[i].x % p[j].x == 0) {
    add_p(p[j].x, a[i].num);
    add_p(a[i].x / p[j].x, a[i].num);
    flag = 1;
    break;
    }
    }
    if (!flag) {
    try1(i);
    }
    }
    }
    void cal() {
    for (int i = 1; i <= cnt; i++) {
    ans *= (p[i].num + 1);
    ans %= mod;
    }
    printf("%lld\n", ans);
    }
    int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
    ll x;
    scanf("%lld", &x);
    if (four(x) || three(x) || two(x)) {
    continue;
    } else {
    add_a(x, 1);
    }
    }
    solve();
    cal();
    return 0;
    }

    代码解释

  • 数据结构:使用nodeprime结构体分别存储数a和质因数p及其出现次数。
  • 四次方、立方、平方检查:通过计算幂次根,判断a_i的结构,记录质因数。
  • 质因数累加:将每个质因数的次数累加到总质因数分解中。
  • 约数个数计算:将每个质因数的次数加1,相乘得到结果,并对结果取模。
  • 通过上述步骤,代码能够高效地解决问题。

    转载地址:http://buml.baihongyu.com/

    你可能感兴趣的文章
    NSJSON的用法(oc系统自带的解析方法)
    查看>>
    nslookup 的基本知识与命令详解
    查看>>
    NSOperation基本操作
    查看>>
    NSRange 范围
    查看>>
    NSSet集合 无序的 不能重复的
    查看>>
    NSURLSession下载和断点续传
    查看>>
    NSUserdefault读书笔记
    查看>>
    NS图绘制工具推荐
    查看>>
    NT AUTHORITY\NETWORK SERVICE 权限问题
    查看>>
    NT symbols are incorrect, please fix symbols
    查看>>
    ntelliJ IDEA 报错:找不到包或者找不到符号
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>