bzoj2790
观察这道题,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的更多相关文章
- 【BZOJ2790】[Poi2012]Distance 筛素数+调和级数
		
[BZOJ2790][Poi2012]Distance Description 对于两个正整数a.b,这样定义函数d(a,b):每次操作可以选择一个质数p,将a变成a*p或a/p, 如果选择变成a/p ...
 - [BZOJ2790][Poi2012]Distance
		
2790: [Poi2012]Distance Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 225 Solved: 115[Submit][Sta ...
 - POI2012题解
		
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
 
随机推荐
- c语言基础:各种数据类型的输出占位符
			
c语言中的输出操作相对java来说是比较麻烦的,每种数据类型的输出都有各自的占位符: 下面是各种数据类型的输出占位符: short/int : %d ; printf("这个整数是:%d&q ...
 - 编译时和运行时、OC中对象的动态编译机制
			
编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...
 - Array.Copy
			
var bt = new byte[] { 0x03, 0x00, 0x01, 0xD9, 0x23 }; var result = new byte[] { 0x01, 0x00, 0x03, 0x ...
 - Careercup - Facebook面试题 - 5733320654585856
			
2014-05-02 09:59 题目链接 原题: Group Anagrams input = ["star, astr, car, rac, st"] output = [[& ...
 - 如何解决Mac与iPhone之间handoff连接问题
			
首先账户以及设备handoff开关问题不再赘述.主要是昨天发现的一个小技巧 当确认所有设备的iCloud账号统一.蓝牙打开.处在同一WiFi下的前提下,我的iPhone和Mac仍然handoff连接有 ...
 - BZOJ3550: [ONTAK2010]Vacation
			
3550: [ONTAK2010]Vacation Time Limit: 10 Sec Memory Limit: 96 MBSubmit: 91 Solved: 71[Submit][Stat ...
 - 首次push本地代码到github上出现的问题及解决方案
			
刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...
 - java 中 ==和equals 的区别
			
Java中equals和==的区别 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolea ...
 - java基础知识回顾之---java StringBuilder与StringBuffer异同点
			
/* * StringBuilder与StringBuffer异同点: * * 使用方法与StringBuffer完全一样 * Str ...
 - Git PHP提交
			
做了个小的DEMO,可以查看: https://github.com/feixiang/webgit.git 这几天一直在郁闷的事情. Git在shell里面执行得好好的,apache运行用户也改成了 ...