自己想的差不多了
没用想到最后的sum变形
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100000+15;
int n;
long long a[maxn];
int tot;
long long prime[maxn];
long long gcd(long long a,long long b)
{
if (b==0) return a;
return gcd(b,a%b);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
long long ls=a[1];
for (long long i=2;i*i<=ls;i++)
if (ls%i==0)
{
prime[++tot]=i;
while (ls%i==0) ls/=i;
}
if (ls!=1) prime[++tot]=ls;
if (a[1]==1) printf("-1");
else printf("%lld",a[1]/prime[1]);
for (int i=2;i<=n;i++)
{
long long now=gcd(a[1],a[i]);
if (now==1)
{
printf(" -1");
continue;
}
for (int j=1;j<=tot;j++)
if (now%prime[j]==0)
{
now/=prime[j];
break;
}
printf(" %lld",now);
}
printf("\n");
return 0;
}