(长度为$n$的序列$a_{i}$,下标范围为$[0,n)$,且用字符串的方式即$a_{[l,r]}$来表示子区间)

定义一个长为$n$的序列$a_{i}$的周期为的$l$满足$l|n$且$\forall l\le i<n,a_{i}=a_{i+l}$(这里不同于普通周期的定义,普通周期定义是没有$l|n$这个要求的),最小正周期即为其中最小的正整数$l$

先考虑枚举一开始回文的$a_{i}$,再将其轮换来构造出所有$a_{i}$,可以证明具有这样两个性质:

1.若一个序列$a_{i}$是回文的,且$a_{i}$的最小正周期为$l$,则$a_{[0,l)}$也是回文的

2.若一个序列$a_{i}$是回文的,且$a_{i}$的最小正周期为$l$,分类讨论:

(1)若$l$为奇数,则将其轮换排列后,不存在与$a_{i}$不同的回文串

(2)若$l$为偶数,则将其轮换排列后,恰好存在一个与$a_{i}$相同的回文串

关于性质1,考虑$a_{[0,l)}=a_{[n-l,n)]}$即可,特别的,当$l=n$时显然也成立

关于性质2,下面来证明一下:

将$a_{i}$轮换后,当以$i\equiv j(mod\ l)$为起点时,两者是相同的,因此不妨假设起点在$[0,l)$中

若以$i$为起点($0<i<l$,当$i=0$时即$a_{i}$本身)时其为回文,不难得到$a_{k}=a_{i+(i-k)}=a_{2i-k}$(下标在模$n$意义下运算)

同时根据性质1,$a_{[0,l)}$自身回文,即$a_{k}=a_{2l-k}$,两式组合即$a_{k}=a_{2(l-i)+k}$

也就是说$2(l-i)$为$a_{i}$周期,同时$l$也是其周期,则$a_{i}$周期可以为$\gcd(l,2(l-i))$

(1)若$l$为奇数,$\gcd(l,2(l-i))=\gcd(l,l-i)<l$,显然矛盾

(2)若$l$为偶数,$\gcd(l,2(l-i))$在$i=\frac{l}{2}$时也是$l$,且显然此时也必然是回文的,因此恰好一个

根据性质2,我们考虑前面枚举回文的$a_{i}$来统计的方式,假设$a_{i}$最小正周期为$l$,则对于奇数的$l$其能提供$l$个不同的$a_{i}$(指最终的结果),对于偶数的$l$能提供$\frac{l}{2}$个$a_{i}$

问题即变为统计最小正周期为$l$的$a_{i}$个数,记为$f_{l}$,考虑如何计算:

性质1的逆命题也成立,即对于长为$n$且最小正周期为$l$的$a_{i}$,若$a_{[0,l)}$为回文,则$a_{i}$本身也是回文的

首先,长为$l$的回文的串一共有$k^{\lceil\frac{l}{2}\rceil}$个,接下来考虑减去最小正周期更小的$l$,也就是$\sum_{d|l,d<l}f_{d}$,显然最终所有状态都会是$n$的约数,转移复杂度即为$\sigma_{0}(n)^{2}$

当$n\le 10^{9}$,则$\sigma_{0}(n)\le 1344$(在$n=735134400$时取到),暴力dp即可

最终答案根据之前的性质2,也就是$\sum_{l|n,l为奇数}l\times f_{l}+\sum_{l|n,l为偶数}\frac{l}{2}\times f_{l}$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 3005
4 #define mod 1000000007
5 int n,k,ans,a[N],f[N];
6 int pow(int n,int m){
7 int s=n,ans=1;
8 while (m){
9 if (m&1)ans=1LL*ans*s%mod;
10 s=1LL*s*s%mod;
11 m>>=1;
12 }
13 return ans;
14 }
15 int main(){
16 scanf("%d%d",&n,&k);
17 for(int i=1;i*i<=n;i++)
18 if (n%i==0)a[++a[0]]=i;
19 int m=a[0];
20 for(int i=1;i<=m;i++)a[++a[0]]=n/a[m-i+1];
21 for(int i=1;i<=a[0];i++){
22 f[i]=pow(k,(a[i]+1)/2);
23 for(int j=1;j<i;j++)
24 if (a[i]%a[j]==0)f[i]=(f[i]+mod-f[j])%mod;
25 }
26 for(int i=1;i<=a[0];i++)
27 if (a[i]&1)ans=(ans+1LL*a[i]*f[i])%mod;
28 else ans=(ans+1LL*a[i]/2*f[i])%mod;
29 printf("%d",ans);
30 }

[atARC064F]Rotated Palindromes的更多相关文章

  1. AtCoder Regular Contest 064 F - Rotated Palindromes

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

  2. 【ARC064-F】【XSY2575】Rotated Palindromes(DP)(字符串)

    Description 然而,由于小C沉迷于制作游戏,他完全忘记了自己作为国家集训队的一员,还有156道作业题等他完成.还有一天作业就要截止了,而他一题还没有做.于是他赶紧挑了一道看起来最简单的题: ...

  3. [ARC064F] Rotated Palindromes

    题意 给定一个整数N,请你求出有多少字符集为1到K之间整数的字符串,使得该字符串可以由一个长度为N的回文串循环移位后得到.所谓循环移位,就是把字符串的某个前缀(可以为空)移到字符串末尾,如" ...

  4. 【SDOI2018】反回文串(【ARC064 F】Rotated Palindromes 加强版)

    题意 给你一个正整数 \(n\),求有多少字符集为 \(1\) 到 \(k\) 之间整数的字符串,使得该字符串可以由一个长度为 \(n\) 的回文串循环移位得到. ARC原题 \(100\%\) 的数 ...

  5. AtCoder Regular Contest

    一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...

  6. 【AtCoder】ARC064

    ARC064 C - Boxes and Candies 先把每个盒子都消到x 然后从前往后推,要求第二个的上界是x-前一个 因为我们要求靠后的那个尽量小,会对后面的修改影响尽量小 #include ...

  7. [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  8. [LeetCode] Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  9. [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

随机推荐

  1. ApsNetCore打造一个“最安全”的api接口

    Authentication,Authorization 如果公司交给你一个任务让你写一个api接口,那么我们应该如何设计这个api接口来保证这个接口是对外看起来"高大上",&qu ...

  2. 洛谷4719 【模板】动态dp 学习笔记(ddp 动态dp)

    qwq大概是混乱的一个题. 首先,还是从一个比较基础的想法开始想起. 如果每次暴力修改的话,那么每次就可以暴力树形dp 令\(dp[x][0/1]\)表示\(x\)的子树中,是否选择\(x\)这个点的 ...

  3. VMD可视化hdf5格式的分子坐标文件

    技术背景 VMD是分子动力学模拟领域常用的一款可视化软件,可以非常直观方便的展示分子的运动过程.而VMD本身对展现的格式有一定的要求,如果不是常见的rst等类型的坐标文件的话,就需要自己手动去实现一个 ...

  4. kivy画板

    from kivy.app import App from kivy.graphics import Line, Color # 引入绘图线条,颜色 from kivy.uix.widget impo ...

  5. spring cloud hystrix的隔离策略和dashboard

    随着服务的拆分,各个服务有着明确的职责,服务之间通过轻量级的协议进行通讯.但有时候我们完成一个功能需要同时调用多个微服务,比如完成订单的创建,那么获取用户信息需要调用用户微服务,获取商品信息需要调用商 ...

  6. vim 常用操作技巧

    记录常用的vim操作技巧,基本满足90%的日常编辑使用. 文档操作 vim test.txt 打开当前目录下的test.txt文档,若不存在则创建该文件 :w 保存当前修改到文件 :w bak.txt ...

  7. FPGA基础之锁存器与触发器的设计

    转载:https://blog.csdn.net/lg2lh/article/details/39081061 一.锁存器 首先设计锁存器的时候应该清楚什么是锁存器,锁存器其实是对电平信号敏感的,一定 ...

  8. 旋转数组的最小数字 牛客网 剑指Offer

    旋转数组的最小数字 牛客网 剑指Offer 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4, ...

  9. 让 AI 为你写代码 - 体验 Github Copilot

    前几天在群里看到有大神分享 Copoilot AI 写代码,看了几个截图有点不敢相信自己的眼睛.今天赶紧自己也来体验一下 Copoilot AI 写代码到底有多神奇. 申请 现在 Copoilot 还 ...

  10. 『学了就忘』Linux基础命令 — 26、帮助命令

    目录 1.man命令 (1)man命令的快捷键 (2)man命令的帮助级别(了解即可) (3)man命令的使用 2.info命令 3.help命令 4.--help选项 1.man命令 man是最常见 ...