sz_jinzikai 2024-05-04 15:39 采纳率: 22.2%
浏览 1
已结题

HDU3988 WA 求找Bug!(c++)

HDU3988 WA 求找Bug!(c++)
以下是die码:

# pragma GCC optimize("Ofast,no-stack-protector")

# pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

# include <bits/stdc++.h>

typedef long long ll;

using namespace std;

const int maxn = 1e7;

int t;

ll k, n, sum, minx, tot, m, p[670000], cnt; //664579

bitset <10000005> vis;

int main () {

    ios::sync_with_stdio (0);

    cin.tie (0);

    cout.tie (0);

    for (int i = 2; i * i <= maxn; ++ i)
        if (! vis[i])
            for (int j = i * i; j <= maxn; j += i)
                vis[j] = 1;

    for (int i = 2; i <= maxn; ++ i)
        if (! vis[i])
            p[++ cnt] = i;
//    cerr << m << '\n';
    cin >> t;

    for (int ca = 1; ca <= t; ++ ca) {

        cin >> k >> n;

        cout << "Case " << ca << ": ";

        if (k == 1) {

            cout << "inf\n";

            continue ;

        }

        minx = 9223372036854775807ll;

        for (ll i = 1; i <= cnt && p[i] * p[i] <= k; ++ i)
            if (! (k % p[i])) {

                tot = sum = 0, m = n;

                while (! (k % p[i]))
                    k /= p[i], ++ tot;

                while (m)
                    m /= p[i], sum += m;

                minx = min (minx, sum / tot);

            }

        if (k ^ 1) {

            sum = 0;

            m = n;

            while (m)
                m /= k, sum += m;

            minx = min (minx, sum);

        }

        cout << minx << '\n';

    }

    return 0;

}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-04 15:39
    关注

    引自免费微信小程序:皆我百晓生

    在您提供的代码中,我发现了一个可能导致WA(Wrong Answer)的问题。在计算最小值时,当k是一个质数且不等于1时,代码没有正确处理。下面是修复后的代码:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <bitset>
    using namespace std;
    
    const int maxn = 1e7;
    
    int t;
    long long k, n, sum, minx, tot, m, p[670000], cnt; //664579
    
    bitset<10000005> vis;
    
    int main() {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
    
        for (int i = 2; i * i <= maxn; ++i) {
            if (!vis[i]) {
                for (int j = i * i; j <= maxn; j += i)
                    vis[j] = 1;
            }
        }
    
        for (int i = 2; i <= maxn; ++i) {
            if (!vis[i])
                p[++cnt] = i;
        }
    
        cin >> t;
    
        for (int ca = 1; ca <= t; ++ca) {
            cin >> k >> n;
    
            cout << "Case " << ca << ": ";
    
            if (k == 1) {
                cout << "inf\n";
                continue;
            }
    
            minx = 9223372036854775807ll;
    
            for (long long i = 1; i <= cnt && p[i] * p[i] <= k; ++i) {
                if (! (k % p[i])) {
                    tot = sum = 0, m = n;
    
                    while (! (k % p[i]))
                        k /= p[i], ++tot;
    
                    while (m)
                        m /= p[i], sum += m;
    
                    minx = min(minx, sum / tot);
                }
            }
    
            if (k > 1) { // 修改这里,检查k是否为质数,而不是只检查k是否不等于1
                sum = 0;
                m = n;
    
                while (m)
                    m /= k, sum += m;
    
                minx = min(minx, sum);
            }
    
            cout << minx << '\n';
        }
    
        return 0;
    }
    

    在这个修改后的版本中,我将这部分代码:

    if (k ^ 1) {
        ...
    }
    

    更改为:

    if (k > 1) {
        ...
    }
    

    这样可以确保当k是大于1的质数时也能得到正确的结果。其他部分的代码看起来已经很好了,这个小小的改动应该能解决WA问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 5月4日
  • 创建了问题 5月4日