题意

  给你一个正整数 \(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\);若为偶数,则对答案贡献 \(\frac{x}{2}\)。

  我们按 \(x\) 把所有字符串分类,统计每一类的数量。

  设 \(f(i)\) 表示最小循环节长度为 \(i\) 的回文串数量,\(F(i)\) 表示循环节长度为 \(i\)(即 \(i\) 是最小循环节长度的正整数倍)能得到新回文串的回文串数量。

  则 $$F(i)=\sum\limits_{d|i} f(d)$$ $$ans = \sum\limits_{d|n} f(d)\times \begin{cases} d(d为奇数) \ \frac{d}{2}(d为偶数) \end{cases}$$

  显然有 \(F(i)=k^{\lceil \frac{i}{2}\rceil}\),我们可以解 \(f(d)\) 了。

  \(n\le 10^{10}\) 时,因数最多约有 \(6700\) 多个。所以我们要求出 \(6700\) 多个 \(f(d)\)。

  移项得 \(f(i)=F(i)-\sum\limits_{d|i 且 d≠i} f(d)\)

  递推 \(f\) 即可。

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

#include<bits/stdc++.h>
#define ll long long
#define N 7000
#define mod 1000000007
using namespace std;
inline int read(){
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c); c=getchar()) if(c=='-') f=0;
for(; isdigit(c); c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return 0-x;
}
int n,k,d[N],f[N],cnt,ans;
int Pow(int x, int y){
int ret=1;
while(y){
if(y&1) ret=(ll)ret*x%mod;
x=(ll)x*x%mod;
y>>=1;
}
return ret;
}
int main(){
n=read(), k=read();
int nn=sqrt(n);
for(int i=1; i<=nn; ++i)
if(n%i==0){
d[++cnt]=i, f[cnt]=Pow(k,(i+1)/2);
for(int j=1; j<cnt; ++j)
if(i%d[j]==0) f[cnt]=((f[cnt]-f[j])%mod+mod)%mod;
ans=(ans+(ll)f[cnt]*((i&1)?i:i/2)%mod)%mod;
}
for(int i=nn; i>=1; --i)
if(n%i==0){
int ii=n/i;
d[++cnt]=ii, f[cnt]=Pow(k,(ii+1)/2);
for(int j=1; j<cnt; ++j)
if(ii%d[j]==0) f[cnt]=((f[cnt]-f[j])%mod+mod)%mod;
ans=(ans+(ll)f[cnt]*((ii&1)?ii:ii/2)%mod)%mod;
}
cout<<ans<<endl;
return 0;
}

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

  \(F(i)=\sum\limits_{d|i} f(d)\) 不是莫比乌斯反演式子?

  根据公式转化成 \(f(i)=\sum\limits_{d|i} F(d)\mu(\frac{i}{d})\)

  我们最多只需要求约 \(17280\) 个 \(\mu\),因此可以暴力 \(\text{dfs}\) 计算每个 \(\mu(i)\),然后就求出 \(f(i)\) 了。

  发现 \(\text{dfs}\) 的时候,\(n\) 的每个质因数只需要乘 \(0\) 或 \(1\) 个,乘 \(2\) 个的话 \(\mu\) 值就变成了 \(0\) 了。

  于是复杂度变为 \(O(17280\times 2^{12})\),但约数数量通常不多,更不会卡满上界 \(17280\),所以卡卡常就能 \(60\) 分?

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

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

【SDOI2018】反回文串(【ARC064 F】Rotated Palindromes 加强版)的更多相关文章

  1. [BZOJ5330][SDOI2018]反回文串

    luogu bzoj sol 枚举一个长度为\(n\)为回文串,它的所有循环位移都可以产生贡献. 但是这样算重了.重复的地方在于可能多个回文串循环同构,或者可能有的回文串经过小于\(n\)次循环位移后 ...

  2. [SDOI2018]反回文串

    题意 问有多少个长度为\(N\)且字符集大小为\(K\)的字符串可以通过回文串旋转 (把第一个字符移到最后)若干次得到.\(K\le N≤10^{18}\) 做法 ARC64F的加强版 设\(h(d) ...

  3. BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...

  4. [BZOJ 5330][SDOI2018] 反回文串

    传送门 怎么说呢,一道不可多得的反演题吧,具体解释之后再补 #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) ...

  5. 「SDOI 2018」反回文串

    题目大意: 求字符集大小为$k$长度为$n$的经循环移位后为回文串的数量. 题解: 这题是D1里最神的吧 考虑一个长度为$n$回文串,将其循环移位后所有的串都是满足要求的串. 但是显然这样计算会算重. ...

  6. AtCoder Regular Contest 064 F - Rotated Palindromes

    Problem Statement Takahashi and Aoki are going to together construct a sequence of integers. First, ...

  7. [luogu4607]反回文串

    参考ARC064F 令$h(n)=\begin{cases}n(n为奇数)\\\frac{n}{2}(n为偶数)\end{cases}$,$f(n)$定义与ARC064F相同,答案即$\sum_{d| ...

  8. 回文串+回溯法 URAL 1635 Mnemonics and Palindromes

    题目传送门 /* 题意:给出一个长为n的仅由小写英文字母组成的字符串,求它的回文串划分的元素的最小个数,并按顺序输出此划分方案 回文串+回溯:dp[i] 表示前i+1个字符(从0开始)最少需要划分的数 ...

  9. HDOJ/HDU 2163 Palindromes(判断回文串~)

    Problem Description Write a program to determine whether a word is a palindrome. A palindrome is a s ...

随机推荐

  1. pandas - parse-date

    1.pd.read_csv()函数中parse_dates()参数 boolean. True -> 解析索引 boolean. If True -> try parsing the in ...

  2. Kafka如何保证百万级写入速度以及保证不丢失不重复消费

    一.如何保证百万级写入速度: 目录 1.页缓存技术 + 磁盘顺序写 2.零拷贝技术 3.最后的总结 “这篇文章来聊一下Kafka的一些架构设计原理,这也是互联网公司面试时非常高频的技术考点. Kafk ...

  3. Ubuntu16.04下使用pycharm导入scrapy框架

    出现迷之问题,ubuntu终端下安装的库在pycharm中无法识别 后重新为pycharm安装相关package,得以使用 看到3即可 https://www.cnblogs.com/airnew/p ...

  4. Maximum Frequency Stack

    Implement FreqStack, a class which simulates the operation of a stack-like data structure. FreqStack ...

  5. 第二天:python数据类型及常用方法

    数字类型 #1. 整型 a1 = 10 a2 = int(20) #2. 长整型(py2特有,py3废弃) b1 = 12345678901234567890 b2 = long(100) #3. 浮 ...

  6. centos服务器之间相互挂载(samba)

    前提:假设A服务器ip为:192.168.1.101 ,B服务器ip为:192.168.1.102现在要求把A服务器的/mnt/test 路径下的文件夹 共享到B服务器的/home/ceshi 下. ...

  7. jenkins转换显示语言为中文简体(jenkins汉化)

    jenkins版本2.117 单位使用的jenkins一直是英文版本,有同事建议切换为中文版. 以下过程完成转换. 一.安装插件 主界面-->系统管理-->插件管理-->可选插件 图 ...

  8. Jenkins常用插件介绍

    摘要: 对于中小型运维团队,jenkins作为运维利器,可以解决很多工作中的痛点.基于UI的特性从而让使用者的入门成本很低,基于插件可以具备认证,记录,条件触发以及联动,让运维工程师可以将精力放在业务 ...

  9. spring-cloud 学习一 介绍

    微服务Microservice,跟之相对应的是将功能从开发到交付都打包成一个很大的服务单元,一般称之为Monolith,也称「巨石」架构.微服务实现和实施思路更强调功能单一,服务单元小型化和微型化,倡 ...

  10. python读写增删修改ini配置文件

    一,百度百科 .ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的 ...