zoukankan      html  css  js  c++  java
  • 【HDOJ6146】Pokémon GO(DP,计数)

    题意:一个2*n的矩阵,从任意一格出发,不重复且不遗漏地走遍所有格子,问方案数 mo 10^9+7

    n<=10000

    思路:因为OEIS搜出来的两个数列都是错误的,所以考虑DP

    设B[i]为2*i的矩阵,从其中一个角开始走,走遍整个矩阵最后回到同一列的方案数

    经打草稿+猜结论得到B[i]=2^(i-1)

    设A[i]为2*i的矩阵,从其中一个角开始走,走遍整个矩阵不一定要回到同一列的方案数

    推导后得A[i]=B[i]+2*A[i-1]+4*A[i-2]

    因为有四个角,所以ANS=a[n]*4

    继续考虑从中间开始走的方案数,可以先往左回来再往右,也可以先往右再往左

    ANS=ANS+8*sigma(a[i-1]*b[n-i]+b[i-1]*a[n-i])

     1 const mo=1000000007;
     2 var a,b:array[1..10000]of int64;
     3     cas,v,i,n:longint;
     4     ans:int64;
     5 
     6 begin
     7  assign(input,'hdoj6146.in'); reset(input);
     8  assign(output,'hdoj6146.out'); rewrite(output);
     9  b[1]:=1;
    10  for i:=2 to 10000 do b[i]:=b[i-1]*2 mod mo;
    11  a[1]:=1; a[2]:=6;
    12  for i:=3 to 10000 do a[i]:=(b[i]+2*a[i-1] mod mo+4*a[i-2] mod mo) mod mo;
    13  readln(cas);
    14  for v:=1 to cas do
    15  begin
    16   readln(n);
    17   if n=1 then
    18   begin
    19    writeln(2);
    20    continue;
    21   end;
    22   ans:=a[n]*4 mod mo;
    23   for i:=2 to n-1 do
    24    ans:=(ans+8*(a[i-1]*b[n-i] mod mo+b[i-1]*a[n-i] mod mo)) mod mo;
    25   writeln(ans);
    26  end;
    27  close(input);
    28  close(output);
    29 end.
  • 相关阅读:
    [luogu T71973]卡常者π酱
    [日常] HEOI 2019 退役记
    [教程]网络流详解: 从入门到放弃
    [LOJ 6213]「美团 CodeM 决赛」radar
    [BZOJ 1568][JSOI2008]Blue Mary开公司
    [BZOJ 3167][HEOI 2013]SAO
    [BZOJ 4763]雪辉
    [LOJ 2146][BZOJ 4873][Shoi2017]寿司餐厅
    [HZNOI #koishi] Magic
    [luogu P4230]连环病原体
  • 原文地址:https://www.cnblogs.com/myx12345/p/7401312.html
Copyright © 2011-2022 走看看