1. (最大质因子)小明有N(1<=N<=5000)个正整数(每个数都不超过20000),他想要从中找出一个含有最大质因子的数。例如10,含有2和5两个质因子;31,含有31这个质因子。
样例输入:
4
36
38
40
42
样例输出:
38 //38含有最大质因子19
var
prime:array[1..20000]of boolean;
a,i,j,n,max,maxnum:word;
procedure create;
var
i,j:word;
begin
fillchar(prime,sizeof(prime),true);
prime[1]:=false;
for i:=2 to 20000 do
for j:=2 to trunc(sqrt(i))do
if i mod j=0 then
begin
_prime[i]:=true_ ;
break;
end;
end;
begin
create;
readln(n);
for i:=1 to n do
begin
readln(a);
for j:= __j:=a downto 2__ do
if(a mod j=0)and( __prime[j]__ )then break;
if _j>max__ then begin max:=j;maxnum:=a;end;
end;
write( __maxnum__ );
readln;
end.
2. (逆序对) 对于一个包含N个非负整数的数组A[1..n],如果有i<j,且A[i]>A[j],则称(A[i],A[j])为数组A中的一个逆序对。例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个。 (n<=1,000,000)
求n个数中的逆序对个数。
【样例输入】
5
3 1 4 5 2
【样例输出】
4
算法提示:采用归并排序的方式,在归并排序的合并过程中统计逆序对数量。
var
a,b:array[1..1000000]of longword;
i,n:longword;
ans:qword;
procedure Merge(l,mid,r:longword);
var
x,y,i,loc:longword;
begin
x:=l;y:= _mid+1_ ;loc:=l;
while(x<=mid)and(y<=r)do
if a[x]<=a[y]then
begin
_b[loc]:=a[x]_ ;inc(loc);inc(x);
end
else
begin
ans:=ans+ _ans+mid-x+1_ ;
b[loc]:=a[y];inc(loc);inc(y);
end;
for i:=x to mid do
begin
b[loc]:=a[i];inc(loc);
end;
for i:=y to r do
begin
b[loc]:=a[i];inc(loc);
end;
for i:=l to r do a[i]:=b[i];
end;
procedure MergeSort(l,r:longword);
var
mid:longword;
begin
if l=r then exit;
mid:=(l+r)div 2;
MergeSort(l,mid);
MergeSort( _mid+1,r_ );
Merge(l,mid,r);
end;
begin
readln(n);
for i:=1 to n do read(a[i]);
MergeSort(1,n);
write( _ans_ );
end.