rectangle 數矩形
這注定是個不眠之夜!
因為msh 達到了rpk 的要求,所以rpk 給了msh 第二個驚喜。rpk 把
msh 帶到了乙個碩大而神秘的廣場,如此廣闊的空間只有兩個人,而一切靜匿到足以聽見對方的心跳。
msh 沉醉了。
rpk:「你知道我有多少話想跟你說麼?」
msh 搖了搖頭。
rpk:「你可以數出來啊,在這個廣場上的地面上你能數到矩形的數量,就是我想說的話的數量。」
msh 數了數,實在是太多了,她完全數不盡。
整個廣場的地面由兩個行和列分別為n1,m1 和n2,m2 的矩形組成,這兩個矩形交叉成十字(n1<n2,m1>m2),在這個圖形中,一共有多少個矩形呢?
一共四行,每行乙個數,分別表示n1,m1 和n2,m2。
output
乙個數表示矩形的數量
sample input
7 9
10 6
sample output
1827
資料規模:
20%的資料每個數≤100;
40%的資料每個數≤10000;
100%的資料每個數≤10的99次方;
【題解】f(x,y)表示x行y列內有多少個矩形,顯然f(x,y)=(x*(x+1)/2)(y(y+1)/2)
輸出f(n1,m1)+f(n2,m2)-f(n1,m2)
數字大的喪心病狂,高精度啦
【code】
program cx;
type bignum=array[0..1000]of longint;
var i:longint;
a,b,c,d,f1,f2,f3,ans:bignum;
st:string;
function
max(x,y:longint):longint;
begin
if x>y then
exit(x);
exit(y);
end;
function
plus1
(x:bignum):bignum;
var i:longint;
begin
x[1]:=x[1]+1;
for i:=1
to a[0] do
begin
if x[i]<10
then break;
x[i+1]:=x[i+1]+x[i] div
10; x[i]:=x[i] mod
10; end;
if x[x[0]+1]>0
then inc(x[0]);
exit(x);
end;
function
plus
(a,b:bignum):bignum;
var c:bignum;
i,x:longint;
begin
fillchar(c,sizeof(c),0);
c[0]:=max(a[0],b[0]);
for i:=1
to c[0] do
begin
x:=a[i]+b[i];
c[i]:=c[i]+x mod
10; c[i+1]:=c[i+1]+x div
10; end;
if c[c[0]+1]>0
then inc(c[0]);
exit(c);
end;
function
minus
(a,b:bignum):bignum;
var c:bignum;
x,i:longint;
begin
x:=0;
fillchar(c,sizeof(c),0);
c[0]:=a[0];
for i:=1
to c[0] do
begin
dec(a[i+1]);
x:=x+a[i]-b[i]+10;
c[i]:=x mod
10; x:=x div
10; end;
while (c[c[0]]=0)and(c[0]>1) do dec(c[0]);
exit(c);
end;
function
mul(a,b:bignum):bignum;
var c:bignum;
i,x,j:longint;
begin
fillchar(c,sizeof(c),0);
c[0]:=a[0]+b[0];
for i:=1
to a[0] do
for j:=1
to b[0] do
begin
c[i+j-1]:=c[i+j-1]+a[i]*b[j];
c[i+j]:=c[i+j]+c[i+j-1]div
10; c[i+j-1]:=c[i+j-1]mod
10; end;
while (c[c[0]]=0)and(c[0]>1) do dec(c[0]);
exit(c);
end;
function
chu4
(a:bignum):bignum;
var i,x:longint;
b:bignum;
begin
x:=0;
fillchar(b,sizeof(b),0);
for i:=a[0] downto1do
begin
x:=x*10+a[i];
b[i]:=x div
4; x:=x mod
4; end;
b[0]:=a[0];
while (b[b[0]]=0) and (b[0]>1) do dec(b[0]);
exit(b);
end;
begin
assign(input, 'rectangle.in'); reset(input);
//assign(output,'rectangle.out');rewrite(output);
readln(st); a[0]:=length(st);
for i:=1
to a[0] do val(st[i],a[a[0]-i+1]);
readln(st); b[0]:=length(st);
for i:=1
to b[0] do val(st[i],b[b[0]-i+1]);
readln(st); c[0]:=length(st);
for i:=1
to c[0] do val(st[i],c[c[0]-i+1]);
readln(st); d[0]:=length(st);
for i:=1
to d[0] do val(st[i],d[d[0]-i+1]);
f1:=chu4(mul(mul(a,b),mul(plus1(a),plus1(b))));
f2:=chu4(mul(mul(c,d),mul(plus1(c),plus1(d))));
f3:=chu4(mul(mul(a,d),mul(plus1(a),plus1(d))));
ans:=minus(plus(f1,f2),f3);
for i:=ans[0] downto1do
write(ans[i]);
writeln;
close(input);
//close(output);
end.
高精度計算 二 高精度的加法運算
例 高精度加法運算 輸入正整數 a 和 b,輸出 a b 的值。0 輸入 第一行 a 第二行 b 輸出 a b 的和。樣例輸入 99 999樣例輸出 1098 分析 1 加法運算 a 7 a 6 a 5 a 4 a 3 a 2 a 1 0 0 b 5 b 4 b 3 b 2 b 1 c 7 c 6 ...
高精度之關於高精度的其他問題
高精度階乘其實就是加法的高階版,樸素的版本可以模擬階乘過程,首先階乘的資料必定不會太大,所以可以持續用高精度乘以低精度進行計算。但是問題是當n 稍微大一點就會導致執行超時。所以可以把n 拆成n n 1 n 2 n 3 或是更少的組進行計算,最後再採用高精度乘以高精度合併結果。當給出的資料位數很大時帶...
高精度計算 二 高精度的加法運算
例 高精度加法運算 輸入正整數 a 和 b,輸出 a b 的值。0 輸入 第一行 a 第二行 b 輸出 a b 的和。樣例輸入 99 999樣例輸出 1098 分析 1 加法運算 a 7 a 6 a 5 a 4 a 3 a 2 a 1 0 0 b 5 b 4 b 3 b 2 b 1 c 7 c 6 ...