【USACO】横幅

【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

输出:
一行,表示可能的方案数。

比赛时一看,神题啊,果断弃疗
赛后,一问同学,恍然大悟,立马AC

我们首先只考虑点(1,1)连出去的情况
如果可行——
可行会满足以下两个条件
1、距离在l1和l2之间,这里要用到勾股定理
2、坐标i和j互质
——的话
ans+=(n-i+1)*(m-j+1)*2;
具体原因自己想想
最后判断特殊情况
则如果l1=1就把ans加上(n+1)*(m+1)
AC。

标程:
var     ans:int64;
        w,h,l1,l2,i,j,k,x:longint;
function gys(a,b:longint):longint;
var     s1,s2,t:longint;
begin
        s1:=a;
        s2:=b;
        if s1>s2 then
        begin
                t:=s1;
                s1:=s2;
                s2:=t;
        end;
        if s2 mod s1=0 then exit(s1)
        else
                exit(gys(s1,s2 mod s1));
end;
begin
        readln(w,h,l1,l2);
        for i:=1 to w do
        for j:=1 to h do
        if gys(i,j)=1 then
        if (sqrt(sqr(i)+sqr(j))>=l1)and(sqrt(sqr(i)+sqr(j))<=l2)then
        ans:=ans+(w-i+1)*(h-j+1);
        ans:=ans*2;
        if(l1=1)then
        begin
        ans:=ans+(w+1)*h;
        ans:=ans+w*(h+1);
        end;
        writeln(ans);
end.


你可能感兴趣的:(比赛TJ,规律)