zoukankan      html  css  js  c++  java
  • 高精度不会的迅速暴击此处

    Rectangle 数矩形
    这注定是个不眠之夜!
    因为MSH 达到了RPK 的要求,所以RPK 给了MSH 第二个惊喜。RPK 把
    MSH 带到了一个硕大而神秘的广场,如此广阔的空间只有两个人,而一切静匿到足以听见对方的心跳。
    MSH 沉醉了。
    RPK:“你知道我有多少话想跟你说么?”
    MSH 摇了摇头。
    RPK:“你可以数出来啊,在这个广场上的地面上你能数到矩形的数量,就是我想说的话的数量。”
    MSH 数了数,实在是太多了,她完全数不尽。
    整个广场的地面由两个行和列分别为N1,M1 和N2,M2 的矩形组成,这两个矩形交叉成十字(N1<N2,M1>M2),在这个图形中,一共有多少个矩形呢?

    这里写图片描述

    Input
    一共四行,每行一个数,分别表示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] downto 1 do
        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] downto 1 do write(ans[i]);
      writeln;
      close(input);
      //close(output);
    end.
  • 相关阅读:
    【BZOJ 2124】【CodeVS 1283】等差子序列
    【BZOJ 1036】【ZJOI 2008】树的统计Count
    【BZOJ 1901】【ZJU 2112】Dynamic Rankings
    【BZOJ 3924】【ZJOI 2015】幻想乡战略游戏
    【BZOJ 4103】【THUSC 2015】异或运算
    【BZOJ 4513】【SDOI 2016】储能表
    【HDU 3622】Bomb Game
    【BZOJ 3166】【HEOI 2013】Alo
    【BZOJ 3530】【SDOI 2014】数数
    【BZOJ 4567】【SCOI 2016】背单词
  • 原文地址:https://www.cnblogs.com/cww97/p/12349453.html
Copyright © 2011-2022 走看看