数青蛙比数螃蟹难多了 这就是来自东方的神秘力量吗 总结下坑点:
当n <= 2时,有无穷多组解,此时注意必须修改一个数据,如果有不在合法范围的则改之,否则随便改一个,改成什么也是任意的 当n == 3时,遍历三种情况取合法者输出即可 当n >= 4时,存在唯一解,根据前四项可以得出正确公比,公比不一定是整数,用浮点记录的话精度可能不够,可以考虑用分数
n <= 2
n == 3
n >= 4
面向测试数据打补丁写出的乱七八糟但仍可供参考的代码:
from decimal import * setcontext(ExtendedContext) getcontext().prec = 2333 D = Decimal n = int(input()) a = [D(i) for i in input().split()] if n <= 2: for i in range(len(a)): if not (1 <= a[i] <= 1e18): a[i] = 1 break else: a[0] = 1 if a[0] != 1 else 2 print(*a) elif n == 3: x, y, z = a for i in [[x, y, y * y / x], [y * y / z, y, z], [x, (x * z).sqrt(), z]]: for ii in i: if not ii.is_finite() or ii != int(ii): break else: if i[2] / i[1] == i[1] / i[0] and min(i) >= 1 and max(i) <= 1e18: print(*(int(ii) for ii in i)) break else: w, x, y, z = a[:4] for i in [[w, x, y, y * y / x], [w, x, (x * z).sqrt(), z], [w, (w * y).sqrt(), y, z], [x * x / y, x, y, z]]: for ii in i: if not ii.is_finite() or ii != int(ii): break else: if i[3] / i[2] == i[2] / i[1] == i[1] / i[0]: t = [i[0]] for j in range(n - 1): t.append(t[-1] * i[3] / i[2]) if min(t) >= 1 and max(t) <= 1e18: print(*(int(tt) for tt in t)) break
坑点楼上的大佬已经说得很清楚了,我就过来补充一个C++版本 1、long double的精度是够的 2、记得四舍五入 3、一定要面向测试数据编程
long double
四舍五入
面向测试数据编程
关于这道题,我确信已发现了一种乱七八糟的证法 ,可惜这里空白的地方太小,写不下。 那就不写了 × 使用超链接 √
数青蛙比数螃蟹难多了
这就是来自东方的神秘力量吗
总结下坑点:
面向测试数据打补丁写出的乱七八糟但仍可供参考的代码:
坑点楼上的大佬已经说得很清楚了,我就过来补充一个C++版本
1、
long double
的精度是够的2、记得
四舍五入
3、一定要
面向测试数据编程
关于这道题,我确信已发现了一种乱七八糟的证法 ,可惜这里空白的地方太小,写不下。
那就不写了 × 使用超链接 √