6 solutions

  • -2
    @ 2025-5-9 17:17:23

    豆包的答案:#include #include #include <unordered_set> #include using namespace std;

    int main() { int n; cin >> n; vector a(n); // 输入每只兔子的数字 for (int i = 0; i < n; ++i) { cin >> a[i]; }

    // 统计0的数量
    int zero_count = count(a.begin(), a.end(), 0);
    // 统计1的数量
    int one_count = count(a.begin(), a.end(), 1);
    // 统计-1的数量
    int minus_one_count = count(a.begin(), a.end(), -1);
    
    // 计算非零元素的乘积
    long long product = 1;
    bool overflow = false;
    for (int num : a) {
        if (num != 0) {
            if (abs(product) > 1e18 / abs(num)) {
                overflow = true;
            }
            product *= num;
            // 控制乘积的大小,防止溢出
            if (abs(product) > 1e18) {
                if (product > 0) product = 1e18;
                else product = -1e18;
            }
        }
    }
    
    unordered_set<long long> unique_values;
    // 遍历每只兔子,计算移除后的乘积
    for (int i = 0; i < n; ++i) {
        long long new_product;
        if (a[i] == 0) {
            if (zero_count == 1) {
                // 移除唯一的0,新乘积为原来的非零乘积
                new_product = product;
            } else {
                // 移除一个0后仍有0,新乘积为0
                new_product = 0;
            }
        } else {
            if (zero_count > 0) {
                // 原乘积为0,移除一个非零数后新乘积为0
                new_product = 0;
            } else {
                // 原乘积非零,计算新乘积
                if (overflow) {
                    // 处理溢出情况
                    if (abs(a[i]) == 1) {
                        // 移除1或-1,乘积可能变化
                        if (a[i] == 1) {
                            if (one_count == 1) {
                                // 移除唯一的1,乘积变化
                                new_product = product;
                            } else {
                                // 还有其他1,乘积不变
                                new_product = product;
                            }
                        } else { // a[i] == -1
                            if (minus_one_count == 1) {
                                // 移除唯一的-1,乘积符号改变
                                new_product = -product;
                            } else {
                                // 还有其他-1,乘积可能不变
                                new_product = product;
                            }
                        }
                    } else {
                        // 移除绝对值大于1的数,乘积变化
                        new_product = product / a[i];
                    }
                } else {
                    // 未溢出情况,直接计算
                    new_product = product / a[i];
                }
            }
        }
        // 如果新乘积与原乘积不同,则加入集合
        if (zero_count == 0 ? new_product != product : new_product != 0) {
            unique_values.insert(new_product);
        }
    }
    
    cout << unique_values.size() << endl;
    return 0;
    

    }

    Information

    ID
    1472
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    (None)
    # Submissions
    211
    Accepted
    24
    Uploaded By