观察这道题,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. iOS 23 种设计模式

    设计模式主要分三个类型:创建型.结构型和行为型. 其中创建型有: 一.Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二.Abstract Factory,抽象工厂 ...

  2. Careercup - Facebook面试题 - 5435439490007040

    2014-05-02 07:37 题目链接 原题: // merge sorted arrays 'a' and 'b', each with 'length' elements, // in-pla ...

  3. Apache Options Indexes FollowSymLinks之讲解

    禁止显示Apache目录列表-Indexes FollowSymLinks 如何修改目录的配置以禁止显示 Apache 目录列表. 缺省情况下如果你在浏览器输入地址: http://localhost ...

  4. 【Android自学之旅】 目录

    [Android自学之旅] 目录 [Android自学之旅] Android开发环境的搭建

  5. 《head first java 》读书笔记(二)

    Updated 2014/03/27 P402-P454 Updated 2014/04/03 P454- 世界三大首席管理器: border, flow, box borderLayout: 五个区 ...

  6. What is the difference between database table and database view?

    The database table has a physical existence in the database. A view is a virtual table, that is one ...

  7. 暑假集训单切赛第二场 UVA 10982 Troublemakers

    题意:将点放在两个集合,同一个集合的边保留,不同集合的边删去,使得边至少减少一半.  输出任何一种方案即可.如果不能,输出Impossible 思路:设如果两个人为一对捣蛋鬼,则two[i][j]=t ...

  8. Javascript 选项卡

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  9. java基础知识回顾之---java String final类 容易混淆的java String常量池内存分析

    /** *   栈(Stack) :存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放  在常量池中). 堆(heap):存 ...

  10. POJ3009Curling 2.0

    http://poj.org/problem?id=3009 题意 : 迷宫升级版,也是m*n的迷宫,0是可以走的,1是阻塞,2是初始点,3是目标位置,这个的阻塞是可以消除的,就是说只要石头撞到阻塞, ...