6 solutions
-
0
Guest MOD
-
-2
豆包的答案:#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