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 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
随机推荐
- 自定义PopupWindow 怎么设置PopupWindow的宽度充满全屏宽度
自定义了一个MyPopMenu类,用于上图中的下拉筛选效果的. 但是按照网上有说需要: new PopupWindow(view,getWindowManager().getDefaultDispla ...
- [原创汉化]linux前端神器 WebStorm8 汉化
只汉化了linux版本 因为linux的工具没win多 不过汉化应该都通用的,自行尝试下. 汉化的不是很完全.有时间放出完全版本来.汉化是个体力活 转载随易,汉化不易,且转且注明 截图: http:/ ...
- dll 入口函数
http://support.microsoft.com/kb/815065/zh-cn // SampleDLL.cpp // #include "stdafx.h" #defi ...
- cf 363D
贪心加二分 虽然比赛后才过 ........ /************************************************************************* &g ...
- 数据库批量插入数据的shell脚本
测试用,先来一个简单的,这个是国产神通数据库的,用isql命令: !/bin/bash == "-h" ] then echo "USAGE: $0 table_name ...
- Class
1. No const constructor Unlike other member functions, constructors may not be declared as const . W ...
- oracle实现自增列
手动创建了一个表格,但是id字段无法实现自增,查看了一下网上的信息,没有找到满意的答案.一下是自己总结摸索的,仅供参考 第一步:手动创建表和列中的字段 (本例中,表明 T_VIDEO,第一个字段:ID ...
- Elasticsearch 学习~
http://cloud.51cto.com/art/201505/476322.htmEs https://www.gitbook.com/book/asdgh000/mongodb-elastic ...
- utmp, wtmp, and lastlog 日志清除工具
utmp, wtmp, and lastlog 日志清除工具 http://blog.itpub.net/83980/viewspace-801664/
- Spring多资源文件properties的配置
Spring简化了加载资源文件的配置,可以通过<context:property-placeholder去加载,这个元素的写法如下: <context:property-placehold ...