观察这道题,d(a,b) 就是先变成最大公约数然后再变成b

设g[x]表示x的质因数数目,不难得到d(a,b)=g[a/gcd(a,b)]+g[b/gcd(a,b)]

因为g[xy]=g[x]+g[y] 所以d(a,b)=g[a/gcd(a,b)]+g[b/gcd(a,b)]=g[a]+g[b]-2*g[gcd(a,b)]

g[]很明显可以用线性筛搞出来,下面考虑如何解决询问

我们发现从穷举是序列中哪个数来考虑,是无法优化的

考虑穷举约数(穷举约数是根号的复杂度,这是一个非常经典的转化)

设f[x]表示在序列中是x倍数的元素g[]最小且编号尽量小的

因为对于每个i,j不等于i,所以我们还要维护一个次优值

这一步我们可以O(n√a)的复杂度

然后我们对于每个元素,我们只要穷举约数,在这个约数是最大公约数的情况下的最优值即可

有人说,如果记录的f[x]的元素和当前询问元素的最大公约数是x的倍数而不是x怎么办

丝毫不影响,因为d(a,b)=g[a]+g[b]-2*g[gcd(a,b)],g[ax]>=g[x] a是正整数

如果这个更新了,那到后面那个最大公约数时肯定会被再更新

 const inf=;
var f,w:array[..,..] of longint;
p,a,g:array[..] of longint;
k,mx,i,t,n,j,ans:longint; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; function cmp(a1,b1,a2,b2:longint):boolean;
begin
if a1=a2 then exit(b1<b2);
exit(a1<a2);
end; procedure work(x,i:longint);
begin
if cmp(g[a[i]],i,f[x,],w[x,]) then
begin
f[x,]:=f[x,];
w[x,]:=w[x,];
f[x,]:=g[a[i]];
w[x,]:=i;
end
else if cmp(g[a[i]],i,f[x,],w[x,]) then
begin
f[x,]:=g[a[i]];
w[x,]:=i;
end;
end; procedure get(x,i:longint);
begin
if w[x,]=i then
begin
if w[x,]= then exit;
if cmp(f[x,]-*g[x],w[x,],ans,k) then
begin
ans:=f[x,]-*g[x];
k:=w[x,];
end;
end
else if cmp(f[x,]-*g[x],w[x,],ans,k) then
begin
ans:=f[x,]-*g[x];
k:=w[x,];
end;
end; begin
readln(n);
for i:= to n do
begin
read(a[i]);
if mx<a[i] then mx:=a[i];
end;
g[]:=;
for i:= to mx do
begin
if g[i]= then
begin
g[i]:=;
inc(t);
p[t]:=i;
end;
for j:= to t do
begin
if i*p[j]>mx then break;
g[i*p[j]]:=g[i]+;
if i mod p[j]= then break;
end;
end;
for i:= to mx do
begin
f[i,]:=inf;
f[i,]:=inf;
end;
for i:= to n do
for j:= to trunc(sqrt(a[i])) do
if a[i] mod j= then
begin
work(j,i);
if j*j<>a[i] then work(a[i] div j,i);
end; for i:= to n do
begin
ans:=inf;
k:=;
for j:= to trunc(sqrt(a[i])) do
if a[i] mod j= then
begin
get(j,i);
if j*j<>a[i] then get(a[i] div j,i);
end;
writeln(k);
end;
end.

bzoj2790的更多相关文章

  1. 【BZOJ2790】[Poi2012]Distance 筛素数+调和级数

    [BZOJ2790][Poi2012]Distance Description 对于两个正整数a.b,这样定义函数d(a,b):每次操作可以选择一个质数p,将a变成a*p或a/p, 如果选择变成a/p ...

  2. [BZOJ2790][Poi2012]Distance

    2790: [Poi2012]Distance Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 225  Solved: 115[Submit][Sta ...

  3. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

随机推荐

  1. DB天气app冲刺二阶段第六天

    今天干了一件让我有点小激动的事情 就是我感觉我貌似找到了为什么我的项目会闪退了有的时候..但是还不确定.等会会再试试看看到底对不对.好吧其实今天就干了这些事整整一下午调试,找bug,决定从头开始一点一 ...

  2. 2007: [Noi2010]海拔 - BZOJ

    Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)× ...

  3. 1069: [SCOI2007]最大土地面积 - BZOJ

    Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大.Input 第1行一个正整数N,接下来N行,每行2个数x,y, ...

  4. ls 排序

    ls 排序 首先我们通过man 来看看 ls其中有几项; -S     sort by file size : 按大小降序 --sort=WORD sort by WORD instead of na ...

  5. mysql导出多个表数据为excel方法,substring函数查询

    //查询sys_username以S.00655开头的用户 ),sys_password FROM `tbl_sa_syslogin` where sys_username like 'S.%'; / ...

  6. Linq to EF 与Linq to Object 使用心得

    大家都知道Linq既可以用来查询数据库对象(我这里指的是Entity FrameWork里的Model对象),也可以用来查询内存中的IEnumerable对象. 两者单独查询时都不会出现什么问题,不过 ...

  7. Linux解压 tar命令

    tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...

  8. H5 移动Web框架集合

    http://frozenui.github.io/  一个简洁的h5前端框架 http://weui.github.io/weui/ 腾讯出的WebUI 风格是基于微信

  9. 【转】Wireshark:“There are no interfaces on which a capture can be done ”

    linux环境下 两种解决方案:    第一种方法:使用root用户登陆        xiaoshancun@xiaoshancun-VM500:~$ sudo wireshark    第二种方法 ...

  10. 分布式内存对象缓存系统Memcached-概述

    全面掌握Memcached 1.       概述 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,是为了加快网站http://www. ...