习题:猜数字(杂论)
题目
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;
}

浙公网安备 33010602011771号