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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值