原题:
http://172.16.0.132/junior/#contest/show/1373/3
题目描述:
被誉为江南四大名木之一的香樟树很有特色,它的树皮粗糙,质地却很均匀,从来没有白杨树的斑斑驳驳、没有柳树的肿瘤结节;树枝树干一分为二、二分为四一路长去,不会偷工减料也不会画蛇添足;树冠的形态是球形的,在天空中画出优美的曲线。
除了上述优点之外,香樟树还有一个秘密武器。那就是……………………它凭借朴实、厚重的优秀品格赢得了小狐狸的青睐!!!
话说有一天,小狐狸正在湖边散步,忽然一阵风吹来,她赶紧闭上眼睛。当她再次睁开眼睛时,发现美丽的湖畔多出了一排整齐的香樟树。小狐狸非常兴奋,她对每棵树都观察入微,并且数出了它们的叶子个数。她觉得如果相邻两棵树的叶子个数互素是不和谐的。因此小狐狸想从一排香樟树中选出若干棵,在满足相邻两棵树的叶子个数不互素的条件下,使得树尽量多。
输入:
第一行一个正整数n,表示有n棵香樟树。
第二行n个正整数,第i个数表示第i棵香樟树叶子的个数。
输出:
一个正整数,表示最多能选多少棵树。
样例输入:
6
6 2 3 15 8 5
样例输出:
4
提示:
样例解释:选择第1、第3、第4和第6棵树
数据范围,对于60%的数据n<=1000
对于100%的数据 n<=100000,叶子个数<=100000
注意:选中的树不能改变其位置,即如果选中第(t1,t2,t3……tn)棵树 ,其中t1
分析:
我们可以发现这就是一个最长不下降子序列!!!,我们只要将条件a[i]>=a[j]改成gcd(a[i],a[j])>1,然而只有60分,数据告诉我!!!可以将j的1~i-1改成i-log(i)*2~i-1,AC走起~~~
实现:
uses math;
var
n,i,j,ans:longint;
f,a:array[0..100007]of longint;
function gcd(x,y:longint):longint;
begin
if x mod y=0 then exit(y) else exit(gcd(y,x mod y));
end;
function lg(x:longint):longint;
var
t:longint;
begin
t:=0;
while x>0 do begin x:=x div 2; inc(T);end;
exit(t);
end;
begin
assign(input,'camphor.in');reset(input);
assign(output,'camphor.out');rewrite(output);
readln(n);
for i:=1 to n do
begin
read(a[i]);
f[i]:=1;
end;
for i:=2 to n do
for j:=i-lg(i)*2 to i-1 do
if (j>0)then
if (gcd(a[j],a[i])>1) then f[i]:=max(f[i],f[j]+1);
for i:=1 to n do
if f[i]>ans then ans:=f[i];
writeln(ans);
close(input);close(output);
end.