JZOJ__Day 10:【普及模拟】【USACO】横幅
题目描述
Bessie结束了国外长途旅游回来。为了迎接她的归来,Farmer John准备在牧场给她挂起一个"Welcome Home"的横幅。横幅会挂在两个柱子间的长度介于L1..L2的金属丝上。(1 <= L1 <= L2; L1 <= L2 <= 1,500)。牧场是一个W×H 的矩阵 (1 <= W <= 1,000; 1 <= H <= 1,000)并且FJ在每个坐标点上都树立起了柱子,在这 (W + 1) * (H + 1)个柱子上,FJ要选两个连上金属丝以挂上横幅。 FJ不希望在横幅之间有任何杂物,就是说在这条金属丝下面没有别的柱子。 FJ需要你编程帮他算出有多少种挂横幅的可能。但是这个数据很大,也许32位整数都放不下。例如如下的牧场地图: W = 2 H = 1 *** *** 而横幅长度为2和3之间。这个牧场共有 (2+1) * (1+1) = 6个点以及有(6 take 5) = (6*5)/(2*1) = 15 种配对方法
(0,0)-(0,1) (0,0)-(2,1) (0,1)-(2,1) (1,1)-(2,0)
(0,0)-(1,0) (0,1)-(1,0) (1,0)-(1,1) (1,1)-(2,1)
(0,0)-(1,1) (0,1)-(1,1) (1,0)-(2,0) (2,0)-(2,1)
(0,0)-(2,0) (0,1)-(2,0) (1,0)-(2,1)
在这之中,只有四种是可以配对的
始位 末位 长度 始位 末位 长度
(0,0)-(2,0) 2.00 (0,1)-(2,0) 2.24
(0,0)-(2,1) 2.24 (0,1)-(2,1) 2.00
但在这四种之中,(0,0)-(2,0)和(0,1)-(2,1)都不符合“没有杂物”的要求,所以这个样例中只有2种结果。
输入
一行,4个整数W, H, L1和 L2
输出
一行,表示可能的方案数。
样例输入
2 1 2 3
样例输出
2
分析
找规律+数学:
①我们手动推理发现,如果矩阵的长宽互质,那么它们的任意一条对角线都不经过其内的任意一个整数坐标点,即不经过柱子,所以我们可以枚举枚举矩形长i宽j的可能性,然后判断它们的gcd是否为1。
如果为1则
长宽互质,所以其对角线是不经过整数坐标点的,所以可能性+1,
然后乘上(w-i+1)*(h-j+1),因为在矩形中有这么多个这种小矩形,就有这么多的可能性
还要乘上2,因为矩形的对角线有2条
②因为上面仅仅只是处理了对角线,但是,我们要考虑!
l1=1的情况,因为任意2个柱子间距为1,这,也是一种情况!!!!
因此这时候我们还要给答案加上h*(w+1)+w*(h+1),因为有这么多个间距
时间复杂度:O((w+1)*(h+1))
程序:
var
i,j,w,h,e:longint;
l1,l2,k:real;
ans:int64;
function work(x,y:longint):longint;
begin
if x=0 then exit(y) else exit(work(y mod x,x));
end;
begin
readln(w,h,l1,l2);
ans:=0;
for i:=1 to w+1 do
for j:=1 to h+1 do
begin
if i<=j then e:=work(i,j) else e:=work(j,i);
if e=1 then
begin
k:=sqrt(sqr(i)+sqr(j));
if (k>=l1) and (k<=l2) then ans:=ans+(w-i+1)*(h-j+1)*2;
end;
end;
if l1=1 then ans:=ans+h*(w+1)+w*(h+1);
write(ans);
end.