zoukankan      html  css  js  c++  java
  • 【ZJOI2017 Round1练习&BZOJ4767】D1T3 两双手(排列组合,DP)

    题意:

    100%的数据:|Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500

    思路:听说这是一道原题

    只能往右或者下走一步且有禁止点的简化版是CF559C

    然而这道题并没有这么简单

    以下开始转化:

    转化后套用弱化版做法即可

     1 const mo=1000000007;
     2 var fac,exf:array[0..1000000]of int64;
     3     dp:array[1..1000]of int64;
     4     x,y:array[1..1000]of longint;
     5     ex,ey,sx,sy,ax,ay,bx,by:int64;
     6     n,n1,i,j:longint;
     7     u,v,eps:double;
     8 
     9 function fabs(x:double):double;
    10 begin
    11  if x<0 then exit(-x);
    12  exit(x);
    13 end;
    14 
    15 procedure swap(var x,y:longint);
    16 var t:longint;
    17 begin
    18  t:=x; x:=y; y:=t;
    19 end;
    20 
    21 procedure qsort(l,r:longint);
    22 var i,j,mid1,mid2:longint;
    23 begin
    24  i:=l; j:=r; mid1:=x[(l+r)>>1]; mid2:=y[(l+r)>>1];
    25  repeat
    26   while (mid1>x[i])or((mid1=x[i])and(mid2>y[i])) do inc(i);
    27   while (mid1<x[j])or((mid1=x[j])and(mid2<y[j])) do dec(j);
    28   if i<=j then
    29   begin
    30    swap(x[i],x[j]);
    31    swap(y[i],y[j]);
    32    inc(i); dec(j);
    33   end;
    34  until i>j;
    35  if l<j then qsort(l,j);
    36  if i<r then qsort(i,r);
    37 end;
    38 
    39 function c(x,y:longint):int64;
    40 begin
    41  exit(fac[x]*exf[y] mod mo*exf[x-y] mod mo);
    42 end;
    43 
    44 begin
    45  assign(input,'hands.in'); reset(input);
    46  assign(output,'hands.out'); rewrite(output);
    47  readln(ex,ey,n1);
    48  readln(ax,ay,bx,by);
    49  fac[0]:=1; fac[1]:=1; exf[0]:=1; exf[1]:=1;
    50  for i:=1 to 1000000 do fac[i]:=fac[i-1]*i mod mo;
    51  for i:=2 to 1000000 do exf[i]:=exf[mo mod i]*(mo-mo div i) mod mo;
    52  for i:=1 to 1000000 do exf[i]:=exf[i-1]*exf[i] mod mo;
    53 
    54  eps:=1e-8;
    55  v:=(ex*ay-ey*ax)/(bx*ay-by*ax);
    56  u:=(ex*by-ey*bx)/(ax*by-ay*bx);
    57  if (fabs(round(v)-v)>eps)or(fabs(round(u)-u)>eps) then
    58  begin
    59   writeln(0);
    60   close(input);
    61   close(output);
    62   exit;
    63  end
    64   else begin inc(n); x[n]:=round(u); y[n]:=round(v); end;
    65  for i:=1 to n1 do
    66  begin
    67   readln(sx,sy);
    68   v:=(sx*ay-sy*ax)/(bx*ay-by*ax);
    69   u:=(sx*by-sy*bx)/(ax*by-ay*bx);
    70   if (fabs(round(v)-v)>eps)or(fabs(round(u)-u)>eps) then continue;
    71   if (u<0)or(v<0) then continue;
    72   if (u>x[1])or(v>y[1]) then continue;
    73   inc(n); x[n]:=round(u); y[n]:=round(v);
    74  end;
    75  inc(n); x[n]:=0; y[n]:=0;
    76  qsort(1,n);
    77  dp[1]:=1;
    78  for i:=2 to n do
    79  begin
    80   dp[i]:=c(x[i]+y[i],x[i]);
    81   for j:=2 to i-1 do
    82    if (x[i]>=x[j])and(y[i]>=y[j]) then
    83     dp[i]:=dp[i]-dp[j]*c(x[i]+y[i]-x[j]-y[j],x[i]-x[j]) mod mo;
    84   dp[i]:=(dp[i] mod mo+mo) mod mo;
    85  end;
    86  writeln(dp[n]);
    87 
    88  close(input);
    89  close(output);
    90 end.
  • 相关阅读:
    快速掌握一个语言最常用的50%[转]
    技术路线的选择重要但不具有决定性 [转]
    图形、图像国外期刊 [转]
    SessionHelper.cs(20170223)
    PageHelper.cs(20170223)
    FileDown.cs(20170223)
    EncryptionHelper.cs(20170223)
    CookieHelper.cs(20170223)
    ConvertJson.cs(20170223)
    ConvertHex.cs(20170223)
  • 原文地址:https://www.cnblogs.com/myx12345/p/6479077.html
Copyright © 2011-2022 走看看