【SDOI2018】反回文串(【ARC064 F】Rotated 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\);若为偶数,则对答案贡献 \(\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 加强版)的更多相关文章
- [BZOJ5330][SDOI2018]反回文串
luogu bzoj sol 枚举一个长度为\(n\)为回文串,它的所有循环位移都可以产生贡献. 但是这样算重了.重复的地方在于可能多个回文串循环同构,或者可能有的回文串经过小于\(n\)次循环位移后 ...
- [SDOI2018]反回文串
题意 问有多少个长度为\(N\)且字符集大小为\(K\)的字符串可以通过回文串旋转 (把第一个字符移到最后)若干次得到.\(K\le N≤10^{18}\) 做法 ARC64F的加强版 设\(h(d) ...
- BZOJ 5330 Luogu P4607 [SDOI2018]反回文串 (莫比乌斯反演、Pollard Rho算法)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=5330 (Luogu) https://www.luogu.org/prob ...
- [BZOJ 5330][SDOI2018] 反回文串
传送门 怎么说呢,一道不可多得的反演题吧,具体解释之后再补 #include <bits/stdc++.h> using namespace std; #define rep(i,a,b) ...
- 「SDOI 2018」反回文串
题目大意: 求字符集大小为$k$长度为$n$的经循环移位后为回文串的数量. 题解: 这题是D1里最神的吧 考虑一个长度为$n$回文串,将其循环移位后所有的串都是满足要求的串. 但是显然这样计算会算重. ...
- AtCoder Regular Contest 064 F - Rotated Palindromes
Problem Statement Takahashi and Aoki are going to together construct a sequence of integers. First, ...
- [luogu4607]反回文串
参考ARC064F 令$h(n)=\begin{cases}n(n为奇数)\\\frac{n}{2}(n为偶数)\end{cases}$,$f(n)$定义与ARC064F相同,答案即$\sum_{d| ...
- 回文串+回溯法 URAL 1635 Mnemonics and Palindromes
题目传送门 /* 题意:给出一个长为n的仅由小写英文字母组成的字符串,求它的回文串划分的元素的最小个数,并按顺序输出此划分方案 回文串+回溯:dp[i] 表示前i+1个字符(从0开始)最少需要划分的数 ...
- HDOJ/HDU 2163 Palindromes(判断回文串~)
Problem Description Write a program to determine whether a word is a palindrome. A palindrome is a s ...
随机推荐
- Python3 Selenium自动化web测试 ==> 第五节 WebDriver高级应用 -- 使用JavaScript操作页面元素
学习目的: 中级水平技术提升 在WebDriver脚本代码中执行JS代码,可以解决某些 .click()方法无法生效等问题 正式步骤: Python3代码如下 # -*- coding:utf-8 - ...
- Linux详细介绍以及常用命令
Linux系统说明 Linux( 诞生于1991.10.5) 继承了Unix以网络为核心的设计思想, 是一个性能稳定的多用户网络操作系统. Linux这个词严格意义上只表示Linux内核, 但日常中, ...
- CSP考试策略
准备 带好手表,身份证,准考证,文具,和矿泉水(热水). 考试之前 如果时间比较充足,可以重启测试保护是否解开. 调整显示屏亮度,检查键盘.鼠标. 关掉拓展名隐藏. 写个简单程序测试是否有异常,测试对 ...
- python中 __file__的小坑坑
在python脚本中,我们难免会需要用到自身文件所在的绝对路径,第一想法可能就是用os.path.dirname(__file__) 但是这里有个大坑,我就踩了,这种方式得到路径会出现问题,脚本执行报 ...
- linux下nginx的学习
安装参考菜鸟教程:https://www.runoob.com/linux/nginx-install-setup.html nginx文档官网: http://nginx.org nginx社区:h ...
- Linux文件属性之用户与用户组基础知识回顾
回顾: 用户.用户组的概念: 每个文件和进程,都需要对应一个用户和用户组. linux系统通过UID和GID来识别用户和组的. 用户名相当于人名 UID和GID 身份证号 管理员:root do ...
- hdoj5909 Tree Cutting(点分治+树上dp转序列dp)
题目链接:https://vjudge.net/problem/HDU-5909 题意:给一颗树,结点带权值v[i]<m.求异或和为k的子树个数(0<=k<m). 思路: 首先点分治 ...
- sql server凭据
转自:https://blog.csdn.net/kk185800961/article/details/52469170 凭据是包含连接到 SQL Server 外部资源所需的身份验证信息(凭据)的 ...
- centos 7 cloudera-manager5.16.2,CDH5.16.2安装升级spark2.4.0
1.在已经安装好系统的linux服务器上关闭selinux和iptables 2.在所有linux服务器上配置ntp服务并设置ntp时间同步 3.在所有linux服务器上安装好cm和cdh版本所需要对 ...
- PHP生成中文验证码并检测对错实例
PHP生成中文验证码并检测对错实例,中文验证码的例子还是比较少的,今天给大家分享一下,支持自定义中文.字体.背景色等 生成验证码,注意font字体路径要对,否则显示图片不存在 session_star ...