都说 k=4 是从 k=3 做简单的推广
查看原帖
都说 k=4 是从 k=3 做简单的推广
203623
critnos楼主2020/6/21 20:57

但是为什么不对啊。。。

#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 那样枚举组合的可能性,然后求每个数再验证(

2020/6/21 20:57
加载中...