#include using namespace std; const int INF = 0x3f3f3f3f; //最大公约数 int gcd(int x, int y) { return y ? gcd(y, x % y) : x; } const int N = 1e6 + 10; int a[N], Left[N], Right[N]; int n; /** * 思想:预处理+前缀和+后缀和 * 前缀和:这里不是真正的前缀和,是预处理出来的前面的最大公约数数组 * 后缀和:这里不是真正的后缀和,是预处理出来的后面的最大公约数数组 */ /** * 测试用例: 5 12 36 24 18 48 * @return */ int main() { cin >> n; for (int i = 1; i <= n; i++)cin >> a[i]; //生成left数组 Left[1] = a[1]; for (int i = 2; i <= n; i++) Left[i] = gcd(Left[i - 1], a[i]); //生成right数组 Right[n] = a[n]; for (int i = n - 1; i >= 1; i--)Right[i] = gcd(a[i], Right[i + 1]); //输出调试结果 //for (int i = 1; i <= n; i++) cout << Left[i] << " "; //cout << endl; //for (int i = 1; i <= n; i++) cout << Right[i] << " "; //cout << endl; //输出ans //删除第一个 cout << Right[1 + 1] << " "; //删除中间的 for (int i = 2; i < n; i++) cout << gcd(Left[i - 1], Right[i + 1]) << " "; //删除最后一个 cout << Left[n - 1] << endl; return 0; }