Description
鸡腿是CZYZ的著名DS,但是不想学数学的DS不是好GFS,所以鸡腿想通过提高数学水平来增强他的GFS气质!虽然你对鸡腿很无语,但是故事的设定是你帮助鸡腿增强了GFS气质,所以现在你必须教鸡腿学数学!
鸡腿想到了一个很高(sha)明(bi)的问题,在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
鸡腿想到了一个很高(sha)明(bi)的问题,在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上。问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子。
Input
一行输入三个正整数N,M,K。
Output
一行输出一个正整数,表示最多的满足条件的长方形数量。
Solution
结论就是:
代码
1 var
2 ans:int64;
3 n,m,k:longint;
4 function min(o,p:int64):int64;
5 begin
6 if o<p then exit(o);
7 exit(p);
8 end;
9
10 function max(o,p:int64):int64;
11 begin
12 if o>p then exit(o);
13 exit(p);
14 end;
15
16 function fd(x:longint):int64;
17 begin
18 exit((x-1)*x div 2);
19 end;
20
21 function main(x,y:longint):int64;
22 var
23 t:longint;
24 begin
25 t:=x;
26 if y<m then t:=y;
27 exit(fd(x)*fd(y)+fd(k-x*y)*t);
28 end;
29
30 procedure main;
31 var
32 i,t,r,x:longint;
33 begin
34 if n>m then
35 begin
36 t:=n; n:=m; m:=t;
37 end;
38 r:=min(n,trunc(sqrt(k)));
39 ans:=0;
40 for i:=2 to r do
41 begin
42 x:=min(m,k div i);
43 if k>=x*(i+1) then continue;
44 ans:=max(ans,main(i,x));
45 end;
46 end;
47
48 begin
49 assign(input,'rectangle.in');
50 assign(output,'rectangle.out');
51 reset(input);
52 rewrite(output);
53 readln(n,m,k);
54 main;
55 writeln(ans);
56 close(input);
57 close(output);
58 end.