题意

  给你一个正整数 \(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. 【AMAD】django-allauth

    简介 个人评分 简介 django-allauth1集成的Oauth API包括: Amazon (OAuth2) AngelList (OAuth2) Bitly (OAuth2) Dropbox ...

  2. 【miscellaneous】多播(组播)原理分析

    为什么要使用多播:        网卡从网络上接收到目标物理地址对应的所有bit位都为1的数据报时,会收到这条消息并将其上传给驱动程序,网卡的这种工作模式称为广播模式,网卡的缺省工作模式包含直接模式和 ...

  3. Android Service 入门

    说明 Service 工作在主进程上.生命周期图 两种状态 Started 比如Activity通过调用startService 方法.一旦被启动(Started),服务就永久在后台运行,即使创建他的 ...

  4. Linux 安装 openoffice

    1 说明 本文档采用rpm包方式安装,操作系统为centos 2 下载openoffice rpm包 创建nginx源码包存放目录 mkdir /usr/local/src/openoffice cd ...

  5. PYTHON 100days学习笔记007-3:字符串和常用数据结构

    目录 Day007:字符串和常用数据结构 1.使用字符串 2.使用列表 3.使用元组 4.使用字典 4.练习 4.1:在屏幕上显示跑马灯文字 4.2 设计一个函数产生指定长度的验证码,验证码由大小写字 ...

  6. 剑指offer3:从尾到头打印链表每个节点的值

    1. 题目描述 输入一个链表,从尾到头打印链表每个节点的值. 2. 思路和方法 2.1 推荐的方法 (1)栈,循环 后进先出,我们可以用栈实现这种顺序.每经过一个结点的时候,把该节点放到一个栈里面,当 ...

  7. PHP以星号隐藏用户名手机号码和邮箱实例

    一款简单实用的PHP以星号隐藏用户名手机号码和邮箱实例,将用户的一些文字信息隐藏一部分用星号代替,以便于保护用户隐私. 隐藏函数: function hideStar($str) { //用户名.邮箱 ...

  8. tensorflow零起点快速入门(1)

    导入: 其中的TF_CPP_MIN_LOG_LEVEL据说是为了忽略警告,但是我这里没有意义(numpy的一些警告) import tensorflow as tf import os os.envi ...

  9. 使用logstash从Kafka中拉取数据并传输给elasticsearch且创建相应索引的操作

    注意事项:默认Kafka传递给elastci的数据是在'data'字段,且不包含其他数据,所以需要使用额外的操作进行处理 logstash配置文件操作 input { kafka { bootstra ...

  10. ssh无密登录_集群分发脚本xsync

    1.ssh免密登录 ssh ip地址 [root@192 ~]# ssh 192.168.1.102 root@192.168.1.102's password: Last login: Mon Fe ...