3251. 数青蛙

CCXXXI_

数青蛙比数螃蟹难多了
这就是来自东方的神秘力量吗
总结下坑点:

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
Chains.Z

坑点楼上的大佬已经说得很清楚了,我就过来补充一个C++版本
1、long double的精度是够的
2、记得四舍五入
3、一定要面向测试数据编程


关于这道题,我确信已发现了一种乱七八糟的证法 ,可惜这里空白的地方太小,写不下。
那就不写了 × 使用超链接

你当前正在回复 博客/题目
存在问题!