益智游戏
时间限制:
20000ms
单点时限:
1000ms
内存限制:
256MB
-
2 3 4
样例输出
-
6
描述
幽香今天心情不错,正在和花田里的虫子玩一个益智游戏。
这个游戏是这样的,对于一个数组A,幽香从A中选择一个数a,虫子从A中选择一个数b。a和b可以相同。她们的分数是a*b的因子的个数。
幽香和虫子当然想要获得尽可能的高的分数,你能告诉她们应该选择哪两个数吗。
由于幽香是个非常随意的人,数组A中的元素都是她随机选择的。
输入
一行一个数n,表示A中整数的数量。
接下来一行n个数,分别表示a1,a2,...,an,为A中的元素。
n <= 100000, 1 <= ai <= 100000
保证所有的ai都是随机生成的。
输出
一行表示最大的分数。
#include <iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=100000+10;
struct node
{
int su;
ll yi;
ll val;
void init()
{
su=0,yi=0;
}
}s[maxn];
int cal(int i,int x)
{
int cnt=1;
int a[50];
memset(a,0,sizeof(a));
for(int j=2;j*j<=x;j++)
if(x%j==0)
{
s[i].su++;
while(x%j==0)
{
a[cnt]++;
x/=j;
}
cnt++;
}
if(x>1) s[i].su++,a[cnt++]++;
ll ans=1;
for(int j=1;j<cnt;j++)
ans=ans*(a[j]+1);
s[i].yi=ans;
}
ll cal2(ll x)
{
int cnt=1;
int a[50];
memset(a,0,sizeof(a));
for(int j=2;j*j<=x;j++)
if(x%j==0)
{
while(x%j==0)
{
a[cnt]++;
x/=j;
}
cnt++;
}
if(x>1) a[cnt++]++;
ll ans=1;
for(int j=1;j<cnt;j++)
ans=ans*(a[j]+1);
return ans;
}
bool cmp(node a,node b)
{
return (a.yi>b.yi);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=maxn;i++)
s[i].init();
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
cal(i,x);
s[i].val=x;
}
ll ans=-1;
sort(s+1,s+1+n,cmp);
for(int i=1;i<=100;i++)
for(int j=i;j<=100;j++)
{
ans=max(ans,cal2(s[i].val*s[j].val));
}
printf("%lld\n",ans);
}
}