1.
麦森数(codevs1087)
题目地址:
http://codevs.cn/problem/1087/
分析:
高精度乘法+快速幂
代码:
type arr=array[0..1000] of integer;
var
p,jj,o,y:longint;
b,c,g:arr;
function wc(m,n:arr):arr;
var i,j,x:longint;
xxx:arr;
begin
fillchar(xxx,sizeof(xxx),0);
for i:=1 to 500 do
begin
x:=0;
for j:=1 to 500 do
begin
xxx[i+j-1]:=xxx[i+j-1]+m[i]*n[j]+x;
x:=xxx[i+j-1] div 10;
xxx[i+j-1]:=xxx[i+j-1] mod 10;
end;
xxx[i+j]:=x;
end;
xxx[0]:=m[0]+n[0];
while (xxx[xxx[0]]=0) and (xxx[0]>1) do dec(xxx[0]);
wc:=xxx;
end;
function kuai(a:longint):arr;
begin
if a=1 then exit(c);
kuai:=kuai(a div 2);
b:=wc(kuai,kuai);
if (a mod 2=0) then exit(b)
else exit(wc(b,c));
end;
begin
readln(p);
c[0]:=1;
c[1]:=2;
g:=kuai(p);
g[1]:=g[1]-1;
y:=trunc(p*ln(2)/ln(10))+1;
write(y);
o:=0;
for jj:=500 downto 1 do
begin
if (jj mod 50=0) then writeln;
write(g[jj]);
end;
writeln;
end.
2.快排核心代码:
procedure cha(l,r:longint);
var i,j,mid,t:longint;
begin
i:=l;
j:=r;
mid:=a[(l+r) div 2];
while i<=j do
begin
while a[i]>mid do inc(i);
while a[j]<mid do dec(j);
if (i<=j) then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
inc(i);
dec(j);
end;
end;
if j>l then cha(l,j);
if i<r then cha(i,r);
end;
总结:
分治策略指的是分而治之的方法。当我们处理大规模问题时,求解可能比较困难,对于这类问题,我们可以将原问题分解成规模较小而结构与原问题相似的子问题,然后递归地解决这些子问题,最后由这些小问题的解构造出原问题的解。一个问题能否用分治法解决,关键是看该问题是否能将原问题分成n个规模较小而结构与原问题相似的子问题。原问题可以分解成多个子问题,这些子问题与原问题相比,只是问题的规模有所降低,其结构和求解方法与原问题相同或相似原问题在分解过程中,递归地求解子问题,由于递归都必须有一个终止条件,因此当分解后的子问题规模足够小时,应该能够直接求解。
分治三个步骤:
分解:将要解决的问题划分成若干个规模较小的同类问题。
求解:当子问题划分得足够小时,用较简单的方法解决
合并:按原问题的要求,将子问题的解逐层合并成原问题的解