时间限制:20000ms
单点时限:1000ms
内存限制:256MB

描述

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

输入

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

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

输出

一行表示最大的分数。

怎么想都没有啥算法,其实正确的暴力姿势也能出奇迹。

刚开始只想到我们求得每个数的因子个数b[i],对然后巧用break;能混过去;

这种形式:if (ans>b[i]*b[j]) break 一层循环,b数组是按照 因子个数从大到小 排序,所以正确。

但是 我们每次算(a[i],a[j])的因子个数总和时还要 一步一步枚举过去,TLE。

比如这段代码:

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string> using namespace std; #define N 100001 int p[N];
int b[N],t; struct node
{
int x,y;
}a[N];
void prime()
{
for (int i=2;i<N;i++)
if (!b[i])
for (int j=i+i;j<N;j+=i)
b[j]=1; for (int i=2;i<N;i++)
if (!b[i]) p[++t]=i;
} int work(int x,int y)
{
int sum=1;
int t=1;
while (1)
{
if (x==1&&y==1) return sum;
int v=1;
if (x%p[t]==0)
{
while (x%p[t]==0)
{
v++;
x/=p[t];
}
}
if (y%p[t]==0)
{
while (y%p[t]==0)
{
v++;
y/=p[t];
}
}
t++;
sum*=v;
}
} int cmp(node a,node b)
{
return a.y>b.y;
} int main()
{
prime(); memset(b,0,sizeof(b));
int n;
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i].x),a[i].y=work(a[i].x,1);
//for (int i=1;i<=n;i++) printf("%d ",a[i].y);
sort(a+1,a+n+1,cmp);
int ans=0;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++){
if (ans>a[i].y*a[j].y) break;
else ans=work(a[i].x,a[j].x);
} printf("%d\n",ans);
return 0;
}

  于是看到一个模板:线性帅法,并且每次能求出一个数的前驱素数因子

 #include<cstdio>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<string> using namespace std; #define N 100001 int p[N];
int b[N],t=; struct node
{
int x,y;
}a[N];
void prime()
{
for (int i=;i<N;i++)
{
if (!b[i]) p[++t]=b[i]=i;
for (int j=;j<=t&&p[j]<=b[i]&&p[j]<=N/i;++j) b[i*p[j]]=p[j];
}
b[]=N;
} int work(int x,int y)
{
int sum=;
int c=;
while (x>||y>)
{
if (b[x]<b[y]) c=b[x];
else c=b[y];
int v=;
for (;b[x]==c;x/=c) v++;
for (;b[y]==c;y/=c) v++;
sum*=v;
}
return sum;
}
inline int cmp(node a,node b)
{
return a.y>b.y;
} int main()
{
prime(); int n;
scanf("%d",&n);
for (int i=;i<=n;i++)
scanf("%d",&a[i].x),a[i].y=work(a[i].x,); sort(a+,a+n+,cmp);
int ans=a[].y;
n=min(n,); for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
if (ans>a[i].y*a[j].y) break;
else ans=max(ans,work(a[i].x,a[j].x));
} printf("%d\n",ans);
return ;
}

但是你 会发现还是很慢,超级慢,9000ms 了,然后又看一份代码,发现!!

我们枚举的

 for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
因为 n可能很大,大概10万,但是后面大多没用,所以我们只要 n<=1000,之类的就够了。 暴力简直可怕

hihocoder 1165 : 益智游戏的更多相关文章

  1. hihoCoder #1165 : 益智游戏 (挑战赛11 B题)

    题意:在一个序列中找到两个数a和b,使得a*b的因子个数最多,输出最多的因子个数. 思路:数据较多,处理会很慢.对序列中每个数字进行质数分解求因子个数,然后按照因子个数降序排列,对前50个因子最多的数 ...

  2. hihocoder -1121-二分图的判定

    hihocoder -1121-二分图的判定 1121 : 二分图一•二分图判定 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 大家好,我是小Hi和小Ho的小伙伴Net ...

  3. Hihocoder 太阁最新面经算法竞赛18

    Hihocoder 太阁最新面经算法竞赛18 source: https://hihocoder.com/contest/hihointerview27/problems 题目1 : Big Plus ...

  4. hihoCoder太阁最新面经算法竞赛15

    hihoCoder太阁最新面经算法竞赛15 Link: http://hihocoder.com/contest/hihointerview24 题目1 : Boarding Passes 时间限制: ...

  5. 【hihoCoder 1454】【hiho挑战赛25】【坑】Rikka with Tree II

    http://hihocoder.com/problemset/problem/1454 调了好长时间,谜之WA... 等我以后学好dp再来看为什么吧,先弃坑(╯‵□′)╯︵┻━┻ #include& ...

  6. 【hihocoder#1413】Rikka with String 后缀自动机 + 差分

    搞了一上午+接近一下午这个题,然后被屠了个稀烂,默默仰慕一晚上学会SAM的以及半天4道SAM的hxy大爷. 题目链接:http://hihocoder.com/problemset/problem/1 ...

  7. 【hihoCoder】1148:2月29日

    问题:http://hihocoder.com/problemset/problem/1148 给定两个日期,计算这两个日期之间有多少个2月29日(包括起始日期). 思路: 1. 将问题转换成求两个日 ...

  8. 【hihoCoder】1288 : Font Size

    题目:http://hihocoder.com/problemset/problem/1288 手机屏幕大小为 W(宽) * H(长),一篇文章有N段,每段有ai个字,要求使得该文章占用的页数不超过P ...

  9. 【hihoCoder】1082: 然而沼跃鱼早就看穿了一切

      题目:http://hihocoder.com/problemset/problem/1082 输入一个字符串,将其中特定的单词替换成另一个单词   代码注意点: 1. getline(istre ...

随机推荐

  1. mongodb多条件查询总结

    根据两字段乘积过滤查询分页数据 db.cron.aggregate([{$project:{_id:,AppID:,result:{$add:["$endlottery",&quo ...

  2. SAP CRM和Cloud for Customer中的Event handler(事件处理器)

    SAP CRM可以在开发工具中用右键直接创建一个新的事件处理器: 这些事件处理器实际上就是UI控制器(Controller)上具有特定接口类型的方法. C4C UI的event handler 在C4 ...

  3. 获取Java接口的所有实现类

    获取Java接口的所有实现类 前言:想看基于spring 的最简单实现方法,请直接看 第七步. 本文价值在于 包扫描的原理探究和实现 一.背景 项目开发中,使用Netty做服务端,保持长连接与客户端( ...

  4. Python3基础教程(十六)—— 迭代器、生成器、装饰器

    在这个实验里我们学习迭代器.生成器.装饰器有关知识. 这几个概念是 Python 中不容易理解透彻的概念,务必把所有的实验代码都完整的输入并理解清楚其中每一行的意思. 迭代器 Python 迭代器(I ...

  5. 测试常用的linux命令

    一.系统 1.halt:         关机   poweroff: 关机 2.reboot:     重启 二.处理目录和文件的命令 1.ll:     显示文件详细信息 ls:    显示文件目 ...

  6. margin塌陷和margin合并问题及解决方案

    margin塌陷 先举个例子 <style> body{ background-color:#000; } .wrapper{ width:200px; height:200px; bac ...

  7. 02-Mysql中的运算符

    Mysql中运算符 1.算术运算符运算符 作用+   加法-    减法*    乘法/,DIV     除法,返回商%,MOD       除法,返回余数 mysql root@localhost: ...

  8. RPM Package Manager

    本文大部分内容来自鸟哥的Linux私房菜,并且由作者根据自己的学习情况做了一些更改,鸟哥原文链接 1. 程序的安装方式 源代码安装:利用厂商释出的Tarball 来进行软件的安装,每次安装程序都需要检 ...

  9. 测试linux服务器带宽

    测试准备 1. 计划考量参数 TCP上传数据带宽 TCP下载数据带宽 UDP上传带宽 UDP下载带宽 多并发支持 稳定性 Tcp通讯网络延迟(小包:32.中包1k.大包1M) UDP通讯网络延迟(小包 ...

  10. Ubuntu配置NFS服务器

    NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可 ...