D. Almost All Divisors(数学分解因子)
2024-10-09 00:52:32
其实这题并不难啊,但是分解因子的细节一定要小心。
\(比如样例48,2是因子说明24也是因子,也就是说假如x存在\)
\(那么x一定是因子中的最小数乘上最大数\)
\(那我们现在去验证x是否存在,先拿x去整除除数表,看看是否所有除数都是x的因子\)
\(然后再去判断x的因子个数是不是等于n(确保除数表包含所有因子)\)
\(考虑到d_i<=1e6,极端情况下x=1e12(我并不确定这种情况存在)\)
\(所以我们不一个一个判断sqrt(x)内的数是否是因子,而是采取短除法\)
ll x=zu,num=0,he=1;
for(int i=1;i<=cnt;i++)//用prime[]中的质数筛选
{
num=0;
if(x%prime[i]==0)
{
while(x%prime[i]==0) num++,x/=prime[i];
he*=(num+1);//包含num+1个prime[i]因子
}
}
if(x>1) he*=2;
\(比如说48=2^4*3^1,所以组合数学嘛,从2因子可以拿0,1,2,3,4个因子,有5种可能\)
\(从3因子可以拿0,1个因子两种可能,也就是总共5*2=10个因子\)
\(因为我们不能一个都不拿或者全部都拿(除数表不包括1和x),所以是10-2=8个因子\)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+9;
ll t,n,a[301];
int prime[100009],cnt;
bool vis[maxn+10];
void make_prime()
{
for(int i=2;i<=maxn;i++)
{
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
cin>>t;
make_prime();
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
if(n>=2)
{
ll zu=a[1]*a[n],flag=1;
for(int i=2;i<=(n+1)/2;i++)//考虑奇数中间的数,所以(n+1)/2
{
if(a[i]*a[n-i+1]==zu) continue;
flag=0;
break;
}
if(flag==0) cout<<-1;
else
{
//判断zu有多少个因子
ll x=zu,num=0,he=1;
for(int i=1;i<=cnt;i++)//用prime[]中的质数筛选
{
num=0;
if(x%prime[i]==0)
{
while(x%prime[i]==0) num++,x/=prime[i];
he*=(num+1);//包含num+1个prime[i]因子
}
}
if(x>1) he*=2;
ll ans=0;
if(he-2==n) cout<<zu;
else cout<<-1;
}
}
else
{
if(vis[a[1]]) cout<<-1;
else cout<<a[1]*a[1];
}
cout<<endl;
}
}
最新文章
- 关于null值的排序
- CSS基础及选择器
- iOS的多版本配置(版本分离,多环境配置)
- codepage IMLangCodePages
- HTTP状态码整理
- winform学习之----打开文件对话框并将文件内容放入文本框
- myeclipse10 .jsp将表单提交给.java(form网页与后台通信初识)
- 危险的 SQL
- Eclipse查找类路径快捷方式
- 树莓派(jessie)制作服务并开机启动
- C#操作word封装
- Excel.Application手册
- GDI+ 图片转存
- VS.NET2010水晶报表安装部署[VS2010]
- 1.PHP连接mysql
- 转://工作中 Oracle 常用数据字典集锦
- RFID系统 免费开源代码 开发,分享[申明:来源于网络]
- 跟随我在oracle学习php(2)
- Jquery ajax ajaxStart()和ajaxStop()加载前的优雅表现
- docker的安装和使用