SDOI2018反回文串(ARC064 FRotated Palindromes 加强版)

Posted scx2015noip-as-php

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDOI2018反回文串(ARC064 FRotated Palindromes 加强版)相关的知识,希望对你有一定的参考价值。

题意

  给你一个正整数 \(n\),求有多少字符集为 \(1\)\(k\) 之间整数的字符串,使得该字符串可以由一个长度为 \(n\) 的回文串循环移位得到。
  ARC原题 \(100\%\) 的数据是 \(n,k\le 10^9\)
  SDOI改编后,\(30\%\) 的数据是 \(n,k\le 10^10\)\(60\%\) 的数据是 \(n,k\le 10^14\)\(100\%\) 的数据是 \(n,k\le 10^18\)……

题解

\(n,k\le 10^10\)

  考虑一个回文串,设它的循环节长度为 \(x\),若 \(x\) 为奇数,则对答案贡献 \(x\);若为偶数,则对答案贡献 \(\fracx2\)
  我们按 \(x\) 把所有字符串分类,统计每一类的数量。
  设 \(f(i)\) 表示最小循环节长度为 \(i\) 的回文串数量,\(F(i)\) 表示循环节长度为 \(i\)(即 \(i\) 是最小循环节长度的正整数倍)能得到新回文串的回文串数量。
  则 \[F(i)=\sum\limits_d|i f(d)\] \[ans = \sum\limits_d|n f(d)\times \begincases d(d为奇数) \\ \fracd2(d为偶数) \endcases\]
  显然有 \(F(i)=k^\lceil \fraci2\rceil\),我们可以解 \(f(d)\) 了。
  \(n\le 10^10\) 时,因数最多约有 \(6700\) 多个。所以我们要求出 \(6700\) 多个 \(f(d)\)

  解法一:移项得 \(f(i)=F(i)-\sum\limits_d|i 且 d≠i f(i)\)
  递推 \(f\) 即可。

  解法二:这不是莫比乌斯反演式子?
  根据公式转化成 \(f(i)=\sum\limits_d|i F(d)\mu(\fracid)\)
  我们最多只需要求 \(6700\) 多个 \(\mu\),因为可以暴力 \(\textdfs\) 计算 \(\mu(i)\)
  然后直接算 \(f(i)\) 即可。

  复杂度大约 \(O(6700^2)\)

\(n,k\le 10^14\)

  发现 \(\textdfs\) 的时候,每个质因数只需要乘 \(0\)\(1\) 个,乘 \(2\) 个的话 \(\mu\) 值就变成了 \(0\) 了。
  于是复杂度变为 \(O(17280\times 2^12)\),但约数数量通常不多,更不会卡满上界 \(17280\),所以卡卡常就能 \(60\) 分?

\(n,k\le 10^18\)

  看不懂,请移步 scb 的博客。

以上是关于SDOI2018反回文串(ARC064 FRotated Palindromes 加强版)的主要内容,如果未能解决你的问题,请参考以下文章

判断回文串

P4324 [JSOI2016]扭动的回文串

面试题 01.04. 回文排列

面试题 01.04. 回文排列

01.04 回文排列

面试题 01.04. 回文排列