您的位置:首页 > 其它

#1165 : 益智游戏

2015-09-12 13:54 288 查看

描述

幽香今天心情不错,正在和花田里的虫子玩一个益智游戏。
这个游戏是这样的,对于一个数组A,幽香从A中选择一个数a,虫子从A中选择一个数b。a和b可以相同。她们的分数是a*b的因子的个数。
幽香和虫子当然想要获得尽可能的高的分数,你能告诉她们应该选择哪两个数吗。
由于幽香是个非常随意的人,数组A中的元素都是她随机选择的。

输入

一行一个数n,表示A中整数的数量。
接下来一行n个数,分别表示a1,a2,...,an,为A中的元素。

n <= 100000, 1 <= ai <= 100000
保证所有的ai都是随机生成的。

输出

一行表示最大的分数。

样例输入
2
3 4

样例输出
6


EmacsNormalVim

真是益智游戏,看了题解才知道“随机选择”是什么意思。

#include<cstdio>
#include<cctype>
#include<queue>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define dwn(i,s,t) for(int i=s;i>=t;i--)
#define ren for(int i=first[x];i!=-1;i=next[i])
using namespace std;
inline int read() {
int x=0,f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
typedef long long ll;
const int maxn=100010;
ll cal(ll a) {
ll res=1;
for(ll i=2;i*i<=a;i++) if(a%i==0) {
int cnt=1;
while(a%i==0) a/=i,cnt++;
res*=cnt;
}
if(a>1) res<<=1;
return res;
}
ll A[maxn],B[maxn],ans;
int od[maxn];
int cmp(int x,int y) {return B[x]>B[y];}
int main() {
int n=read();
rep(i,1,n) A[i]=read(),B[i]=cal(A[i]),od[i]=i;
sort(od+1,od+n+1,cmp);
n=min(n,1000);
rep(i,1,n) rep(j,i,n) if((ll)B[od[i]]*B[od[j]]>=ans) ans=max(ans,cal(A[od[i]]*A[od[j]]));
printf("%lld\n",ans);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: