• 高维网络


    高维网络

     

    【问题描述】

    现在有一个 维的坐标网格,其中第 维坐标的范围是[0,     ]。

     

    在这个范围内建立一个有向图:我们把范围内的每个整点(每一维坐标均为

    整数的点)当做图上的顶点。设点 (0,0, ⋯ ,0),  (  1, 2, ⋯ ,    )。

    对于范围内的点(  1, 2, ⋯ , ),它会向以下这些点(如果目标点在范围内):

    1 + 1, 2, ⋯ ,                       ), (  1, 2 + 1, ⋯ , ), ⋯ , (  1, 2, ⋯ ,      + 1)连有向边。

     

    现在从点 到点 会有若干条路径,路径的条数可以十分简单地算出。然而不幸的是,范围内有 个点被破坏了(点 和点 不会被破坏),其中第 个点的坐

    标为(   ,1,  ,2, ⋯ ,  ,  )。你需要算出从点 到点 剩余的路径条数。

    由于答案可能很大,你只需要输出它对1,000,000,007取模的结果。

    分析:

    这个题只会80 分做法:

    当n=1时判断结果,有断点为0,无断点为1;

    当n=2或3 时,且a[i]的范围比较小时,dp;

    当p=0时,用组合数公式。

    代码实现:

    program exam;

    const

      pz=1000000007;

    var

      i,j,k:longint;

      d,p,x,y,z:longint;

      pan:boolean;

      ans,a1,a2,a3,sum:int64;

      f2:array[-1..1000,-1..1000] of int64;

      b2:array[-1..1000,-1..1000] of boolean;

      t2:array[-1..1000,-1..1000] of int64;

      f3:array[-1..100,-1..100,-1..100] of int64;

      t3:array[-1..100,-1..100,-1..100] of int64;

      b3:array[-1..100,-1..100,-1..100] of boolean;

      a:array[1..10000] of longint;

    function f(a,b:int64):int64;

    var

      t,y:int64;

    begin

      t:=1;

      y:=a;

      while b<>0 do

      begin

        if (b and 1)=1 then

          t:=t*y mod pz;

        y:=y*y mod  pz;

        b:=b shr 1;

      end;

      exit(t);

    end;

    function comb(n,m:int64):int64;

    var

      i,j:longint;

      a1,b1:int64;

    begin

      a1:=1;

      for i:=1 to m do

        a1:=((a1 mod pz)*((n-i+1) mod pz)) mod pz;

      b1:=1;

      for i:=1 to m do

        b1:=((b1 mod pz)*(i mod pz)) mod pz;

      b1:=f(b1,pz-2);

      a1:=((a1 mod pz)*(b1 mod pz)) mod pz;

      exit(a1);

    end;

    function com(t,sum:int64):int64;

    var

      i,j:longint;

      a1,b1:int64;

    begin

      a1:=1;

      for i:=1 to sum do

        a1:=((a1 mod pz)*(i mod pz)) mod pz;

      b1:=1;

      for j:=1 to t do

        for i:=1 to a[j] do

          b1:=((b1 mod pz)*(i mod pz)) mod pz;

      b1:=f(b1,pz-2);

      a1:=((a1 mod pz)*(b1 mod pz)) mod pz;

      exit(a1);

    end;

    begin

      assign(input,'cube.in');

      reset(input);

      assign(output,'cube.out');

      rewrite(output);

      readln(d,p);

      pan:=false;

      if d=1 then

      begin

        if p=0 then

          writeln('1');

        if p>0 then

          writeln('0');

      end;

      if d=2 then

      begin

        for i:=1 to d do

        begin

          read(a[i]);

          if a[i]>1000 then

            pan:=true;

        end;

        if pan=false then

        begin

          for i:=1 to p do

          begin

            readln(x,y);

            b2[x,y]:=true;

          end;

          t2[0,0]:=1;

          for i:=0 to a[1] do

            for j:=0 to a[2] do

            begin

              if (b2[i-1,j]=false) and (b2[i,j-1]=false) then

                f2[i,j]:=f2[i-1,j] mod pz+f2[i,j-1] mod pz+t2[i,j] mod pz;

              if (b2[i-1,j]=false) and (b2[i,j-1]=true) then

                f2[i,j]:=f2[i-1,j] mod pz+0+t2[i,j] mod pz;

              if (b2[i-1,j]=true) and (b2[i,j-1]=false) then

                f2[i,j]:=0+f2[i,j-1] mod pz+t2[i,j] mod pz;

              if (b2[i-1,j]=true) and (b2[i,j-1]=true) then

                f2[i,j]:=0+0+t2[i,j] mod pz;

            end;

          writeln(f2[a[1],a[2]] mod pz);

        end;

        if (pan=true) and (p=0) then

        begin

          ans:=comb(a[1]+a[2],a[1]);

          writeln(ans);

        end;

      end;

      if d=3 then

      begin

        for i:=1 to d do

        begin

          read(a[i]);

          sum:=sum+a[i];

          if a[i]>100 then

            pan:=true;

        end;

        if pan=false then

        begin

          fillchar(b3,sizeof(b3),true);

          for i:=1 to p do

          begin

            readln(x,y,z);

            b3[x,y,z]:=false;

          end;

          t3[0,0,0]:=1;

          for i:=0 to a[1] do

            for j:=0 to a[2] do

              for k:=0 to a[3] do

              begin

                if (b3[i-1,j,k]=true) and (b3[i,j-1,k]=true) and (b3[i,j,k-1]=true) then

                  f3[i,j,k]:=f3[i-1,j,k] mod pz+f3[i,j-1,k] mod pz+f3[i,j,k-1] mod pz+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=true) and (b3[i,j-1,k]=false) and (b3[i,j,k-1]=true) then

                  f3[i,j,k]:=f3[i-1,j,k] mod pz+0+f3[i,j,k-1] mod pz+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=true) and (b3[i,j-1,k]=true) and (b3[i,j,k-1]=false) then

                  f3[i,j,k]:=f3[i-1,j,k] mod pz+f3[i,j-1,k] mod pz+0+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=true) and (b3[i,j-1,k]=false) and (b3[i,j,k-1]=false) then

                  f3[i,j,k]:=f3[i-1,j,k] mod pz+0+0+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=false) and (b3[i,j-1,k]=true) and (b3[i,j,k-1]=true) then

                  f3[i,j,k]:=0+f3[i,j-1,k] mod pz+f3[i,j,k-1] mod pz+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=false) and (b3[i,j-1,k]=false) and (b3[i,j,k-1]=true) then

                  f3[i,j,k]:=0+0+f3[i,j,k-1] mod pz+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=false) and (b3[i,j-1,k]=true) and (b3[i,j,k-1]=false) then

                  f3[i,j,k]:=0+f3[i,j-1,k] mod pz+0+t3[i,j,k] mod pz;

                if (b3[i-1,j,k]=false) and (b3[i,j-1,k]=false) and (b3[i,j,k-1]=false) then

                  f3[i,j,k]:=0+0+0+t3[i,j,k] mod pz;

              end;

          writeln(f3[a[1],a[2],a[3]] mod pz);

        end;

        if (pan=true) and (p=0) then

        begin

          ans:=com(d,sum);

          writeln(ans);

        end;

      end;

      if (d>3) and (p=0) then

      begin

        for i:=1 to d do

        begin

            read(a[i]);

          sum:=sum+a[i];

        end;

        ans:=com(d,sum);

        writeln(ans);

      end;

      if (d>3) and (p<>0) then

        writeln('0');

      close(input);

      close(output);

    end.

  • 相关阅读:
    引号的区别
    QT中加载动态链接库
    QString 转换为 char *
    C++虚继承初识
    虚析构函数详解
    赋值兼容规则
    利用docker搭建spark hadoop workbench
    《用Java写一个通用的服务器程序》03 处理新socket
    《用Java写一个通用的服务器程序》02 监听器
    《用Java写一个通用的服务器程序》01 综述
  • 原文地址:https://www.cnblogs.com/fengxiudong/p/6017231.html
Copyright © 2020-2023  润新知