习题:猜数字(杂论)

题目

zz作为hb中学最著名的猜测大师,他对几乎所有的事情都可谓料事如神。这不,zz又将大展身手,准备进行新一轮事件的猜测。现在,zz手里有n个数字,他需要猜出一个数字,使得这n个数字都是这个数字除1和它本身外的所有的其他因数。zz觉得这种问题过于简单,不屑于回答,于是就把这个问题丢给了你们。

输入格式

第一行输入一个数字t(1≤t≤25),表示需要猜测的数字个数。

对于每次猜测,第一行输入一个数字n(1≤n≤300),表示此次猜测的因数个数。

第二行输入n个数字a1,a2,…,an(2≤ai≤10^6),表示需要猜测的数字的第i个因数。题目保证输入的ai各不相同。

输出格式

输出一个数字,即zz需要猜测的这个数。如果没有满足题目条件的数字,则输出-1.

思路

第一眼看到这道题,直接就是想的是对每一个因数进行质因数分解,之后再来构造
但是仔细想一想
设这数为x,第i个因数为xi ,* 确定x中的数字是从小到大排序的 * 一共有n个因数
然后我们可以发现x1 * x n ==x2 * xn-1 ==x3 * xn-2
所以我们就可以得到这个数
之后再暴力检测这个数的因子是否已经被全部包含

代码



#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<climits>
using namespace std;
#define int long long
int t;
int n;
int a[305];
void c_in()
{
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+n+1);
	int ans=a[1]*a[n];
	int t=0;
	for(int i=2;i<=sqrt(ans);i++)
	{
		if(ans%i==0)
		{
			t++;
		}
	}
	t*=2;
	int sq=sqrt(ans);
	if(sq*sq==ans)
	{
		t--;
	}
	if(t!=n)
	{
		cout<<"-1"<<endl;
		return;
	}
	for(int i=2;i<=(n+1)/2;i++)
	{
		if(ans!=a[i]*a[n-i+1])
		{
			cout<<"-1"<<endl;
			return;
		}
	}
	if(ans==a[n])
		cout<<"-1"<<endl;
	else
		cout<<ans<<endl;
}
signed main()         
{
	//ios::sync_with_stdio(false);
	cin>>t;
	for(int i=1;i<=t;i++)
		c_in();
	return 0;
}

posted @ 2019-09-26 13:32  loney_s  阅读(216)  评论(0)    收藏  举报