loj#P6438. 框出一个正方形

框出一个正方形

题目描述

(本题的最初想法非原创,原始链接有剧透,可参见讨论区)

在平面直角坐标系中,你可以每次选择两个格点((x,y)(x,y),其中 xxyy 都是整数的点),然后做出过这两个点的直线。

画出四条这样的直线,可以围成一个正方形,这个正方形具有面积 SS

给定面积 SS,是否存在一种方案能围出这个正方形?如果是,请给出一种构造。

我们只考虑有理数 S=p/qS = p / q 的情况,而你的输出也必须是精确解。

举例:

  • 1/21/25/25/24/54/5 可以构造
  • 1/41/42/32/3 不能构造
  • 12/1512/15 就是 4/54/5,所以可以构造

例如,下面是一个 4/54/5 的构造

输入格式

第一行是一个整数 TT,表示总共有 TT 组询问

之后 TT 行,每行两个整数 ppqq0<p,q<5×1060 < p, q < 5 \times 10^6),表示本次询问的是 S=p/qS = p/q 的构造。

输出格式

对于每组询问,输出一行:

  • 如果给出的面积 SS 可以构造,输出 1616 个空格分隔的整数表示你的构造,包含:
    • 44 条能围成面积为 SS 的正方形的线(不必在意线的顺序)
    • 每条线 22 个点
    • 每个点两个整数 xxyy 表示 (x,y)(x, y) 这个点,其中,264<x,y<264-2^{64} < x, y < 2^{64} (参见“数据范围与提示”)
  • 否则,面积 SS 不能构造,输出一行 impossible
2
1 3
4 5
impossible
0 0 1 2 1 2 3 1 2 2 1 0 1 1 3 0

数据范围与提示

总共有 1010 个测试点,每个测试点记 1010 分。其中:

  • 测试点 11 的输入如下:
    5
    4999889 3988009
    4012009 4999762
    3674633 4999348
    4997709 2000066
    4782969 1953125
    
  • 对于测试点 252 \dots 5T=1T = 1
  • 对于测试点 6106 \dots 10T=20000T = 20000

虽然检查器使用高精度整数读入答案,但是极不推荐输出绝对值超过 2642^{64} 的坐标值 xxyy。这一点不应在解题过程之中产生限制。如果因坐标值绝对值过大且超出此范围,而导致无法正常评测,本题作者不接受为解决此问题改动题目的请求。