Loading

AT_arc166_c [ARC166C] LU / RD Marking

这种类型的题(对脑电波题)有些题能秒,有些题想多久都想不出来。。。

显然本题能一起染黑的边存在某种关系,我们考虑一条边可以和哪两条边一起染色,乍一看如果还没看出来有什么性质,我们就考虑把连着的边再这样考虑一遍。

突然,灵光乍现!我们这样连可以连出来个斜线!也就是说我们可以将网格图拆开,分开讨论每一个斜线。我们把每个斜线拉直变成序列,发现这显然可以 dp 处理,设 fi,0 表示到第 i 位末尾有偶数个点染黑, fi,1 表示到第 i 位末尾有奇数个点染黑,转移非常 easy:

fi,0=fi1,0+fi1,1

fi,1=fi1,0

然后我们再回到网格图,手玩一下就会发现分开的斜线含有的边的数量是一个类似分段函数的东西,不妨设 n<m,前 n 条斜线的长度是差为 2 的等差数列,后面有 mn 条长度为 2n+1 的斜线,再往后有跟第一段等价的一段。

那么我们预处理出累乘的值,每次询问再用快速幂算出第二段的值就做完啦!

时间复杂度 O(n+Tlogn)

代码:

int f[N][2], g[N];
signed main ()
{
  f[0][0] = 1;
  g[0] = 1;
  rep (i, 1, N - 1) f[i][0] = (f[i - 1][0] + f[i - 1][1]) % P, f[i][1] = f[i - 1][0];
  rep (i, 1, N - 1) if (i & 1) g[i + 1] = g[i - 1] * f[i + 1][0] % P;
  int T = rd ();
  for (; T; -- T)
  {
    int n = rd (), m = rd ();
    if (n > m) swap (n, m);
    printf ("%lld\n", g[n * 2] * g[n * 2] % P * qpow (f[n * 2 + 1][0], m - n) % P);
  }
}

作者:lalaouye

出处:https://www.cnblogs.com/lalaouyehome/p/18302152

版权:本作品采用「114514」许可协议进行许可。

posted @   lalaouye  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示