高精度不會的迅速暴擊此處

2022-08-17 21:24:11 字數 3939 閱讀 8998

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 ...