但是为什么不对啊。。。
#include<bits/stdc++.h>
#define ll long long
#define lll __int128
using namespace std;
ll gcd[10],lcm[10],ans[10];
lll f[10][10],gcd2[10][10],lcm2[10][10];
int k;
lll lcm_(ll x,ll y)
{
return (lll)x*y/__gcd(x,y);
}
bool check3()
{
int i,j,s1=0,s2=0;
for(i=1;i<k;i++)
for(j=i+1;j<=k;j++)
s1+=__gcd(ans[i],ans[j])+lcm_(ans[i],ans[j]);
for(i=1;i<k;i++)
for(j=i+1;j<=k;j++)
s2+=gcd2[i][j]+lcm2[i][j];
return s1==s2;
}
int main()
{
int t,su,i,j,w;
lll ans1;
cin>>t>>k;
su=k*(k-1)/2;
while(t--)
{
for(i=1;i<=su;i++)
cin>>gcd[i];
for(i=1;i<=su;i++)
cin>>lcm[i];
sort(gcd+1,gcd+1+su);
sort(lcm+1,lcm+1+su);
if(k==2)
{
cout<<gcd[1]<<endl<<lcm[1]<<endl;
continue;
}
if(k==3)
{
do
{
w=0;
for(i=1;i<k;i++)
for(j=i+1;j<=k;j++)
f[i][j]=(lll)gcd[++w]*lcm[w],gcd2[i][j]=gcd[w],lcm2[i][j]=lcm[w];
ans1=__gcd(f[1][2],f[1][3]);
if(ans1%gcd2[2][3]==0)
{
ans[1]=ans1/gcd2[2][3];
ans[2]=f[1][2]/ans[1];
ans[3]=f[1][3]/ans[1];
if(check3())
{
for(i=1;i<=k;i++)
cout<<ans[i]<<' ';
cout<<endl;
goto bre;
}
}
}while(next_permutation(gcd+1,gcd+1+su));
}
if(k==4)
{
do
{
w=0;
for(i=1;i<k;i++)
for(j=i+1;j<=k;j++)
f[i][j]=(lll)gcd[++w]*lcm[w],gcd2[i][j]=gcd[w],lcm2[i][j]=lcm[w];
ans1=__gcd(f[1][2],f[1][3]);
if(ans1%gcd2[2][3]==0)
{
ans[1]=ans1/gcd2[2][3];
ans[2]=f[1][2]/ans[1];
ans[3]=f[1][3]/ans[1];
ans[4]=f[1][4]/ans[1];
if(1)
{
for(i=1;i<=k;i++)
cout<<ans[i]<<' ';
cout<<endl;
goto bre;
}
}
}while(next_permutation(gcd+1,gcd+1+su));
}
bre:;
}
}
大概是同样像 k=3 那样枚举组合的可能性,然后求每个数再验证(