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 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
随机推荐
- ios显示艺术字字体颜色渐变
UIColor * myColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"123.jpg"]]; self. ...
- 第一个Nodejs程序
我的第一个Nodejs程序:Hello World var http = require("http"); http.createServer(function(request, ...
- 无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent
无法将 flash.display::Sprite@156b7b1 转换为 mx.core.IUIComponent 在Flex Application里,是不能直接用addChild添加Sprite ...
- JSP访问Spring中的bean
JSP访问Spring中的bean <%@page import="com.sai.comment.po.TSdComment"%> <%@page import ...
- 1-Highcharts环境介绍及配置
Highcharts:功能强大.开源.美观.图表丰富.兼容绝大多数浏览器的纯js图表库,废话不多说,直接进入主题! 首先,下载Highcharts包文件,下载地址如下: 中文网下载中心:http:// ...
- android C/C++ source files 全局宏定义 .
\system\core\include\arch\linux-arm AndroidConfig.h * ============================================== ...
- Binary Search Tree In-Order Traversal Iterative Solution
Given a binary search tree, print the elements in-order iteratively without using recursion. Note:Be ...
- POJ 2246 Matrix Chain Multiplication(结构体+栈+模拟+矩阵相乘)
题意:给出矩阵相乘的表达式,让你计算需要的相乘次数,如果不能相乘,则输出error. 思路: 参考的网站连接:http://blog.csdn.net/wangjian8006/article/det ...
- ASP.NET 免费开源控件
AspNetPager分页控件(当前版本:7.5.1) AspNetPager分页控件是应用于ASP.NET WebForm网站或应用程序中的自定义分页控件,支持默认的回发(Postback)分页和U ...
- java二维码生成与解析代码实现
TwoDimensionCode类:二维码操作核心类 package qrcode; import java.awt.Color; import java.awt.Graphics2D; import ...