[ARC064F] Rotated Palindromes
题意
给定一个整数N,请你求出有多少字符集为1到K之间整数的字符串,使得该字符串可以由一个长度为N的回文串循环移位后得到。所谓循环移位,就是把字符串的某个前缀(可以为空)移到字符串末尾,如"1221"循环移位可以得到"1221"、"2211"、"2112"、"1122"四个字符串。结果对$10^9+7$取模
题解
考试时花了差不多一个小时推了一个$O(n)$的式子,还妄想着能优化到$O(sqrt(n))$......
首先,考虑一个回文串对答案的贡献:
设其最小循环节长度为len。
其贡献就是len。
但是一个回文串的循环节必定也是回文串(想不明白可以看这个:abcabcabc)
所以对于len为偶数的情况,循环节可以从中间拆开,这就导致了互换前后段后相同的循环节,例如2112,1221会扩展出一样的结果,所以要此时贡献要除以2.
但对于长度为奇数的情况,由于有中间的一位,所以互换前后段后扩展出来的仍是不同的结果,所以不用除以2。
因为len相同的回文串对答案的贡献相同,所以对于每一个len,统计代表的回文串个数即可。
又因为len一定是n的因数(不然何来循环),所以直接根号n预处理出n的因数即可。
代码
#include <algorithm>
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define int long long
#define mod (int)1000000007
#define N 64000
vector<int> vec;
int tot[N];
int pow(int base,int up)
{
int ans=1;
while(up)
{
if(up&1) ans*=base,ans%=mod;
base*=base;
base%=mod;
up>>=1;
}
return ans;
}
signed main()
{
int n,k,len;
cin>>n>>k;
len=sqrt(n);
for(int i=1;i<=len;i++) if(n%i==0)//获取所有可能的循环节长度
{
vec.push_back(i);
if(i!=n/i) vec.push_back(n/i);
}
sort(vec.begin(), vec.end());
int ans=0;
for(int i=0;i<vec.size();i++)
{
tot[i]=pow(k,(vec[i]+1)/2);//循环节长度为vec[i]时循环节的数量。因为是回文串,所以只需要知道前面半截即可确定出整个回文串,下面也是同理
for(int j=0;j<i;j++) if(vec[i]%vec[j]==0)
tot[i]-=tot[j],tot[i]=(tot[i]+mod)%mod;//去除【长度为vec[i]的循环节】内部含有循环节的情况
if(vec[i]&1) ans+=tot[i]*vec[i],ans%=mod;
else ans+=tot[i]*(vec[i]/2),ans%=mod;
}
cout<<ans;
}
[ARC064F] Rotated Palindromes的更多相关文章
- 【ARC064-F】【XSY2575】Rotated Palindromes(DP)(字符串)
		
Description 然而,由于小C沉迷于制作游戏,他完全忘记了自己作为国家集训队的一员,还有156道作业题等他完成.还有一天作业就要截止了,而他一题还没有做.于是他赶紧挑了一道看起来最简单的题: ...
 - AtCoder Regular Contest 064 F - Rotated Palindromes
		
Problem Statement Takahashi and Aoki are going to together construct a sequence of integers. First, ...
 - 【SDOI2018】反回文串(【ARC064 F】Rotated Palindromes 加强版)
		
题意 给你一个正整数 \(n\),求有多少字符集为 \(1\) 到 \(k\) 之间整数的字符串,使得该字符串可以由一个长度为 \(n\) 的回文串循环移位得到. ARC原题 \(100\%\) 的数 ...
 - [atARC064F]Rotated Palindromes
		
(长度为$n$的序列$a_{i}$,下标范围为$[0,n)$,且用字符串的方式即$a_{[l,r]}$来表示子区间) 定义一个长为$n$的序列$a_{i}$的周期为的$l$满足$l|n$且$\fora ...
 - AtCoder Regular Contest
		
一句话题解 因为上篇AGC的写的有点长……估计这篇也短不了所以放个一句话题解方便查阅啥的吧QwQ 具体的题意代码题解还是往下翻…… ARC 058 D:简单容斥计数. E:用二进制表示放的数字,然后状 ...
 - 【AtCoder】ARC064
		
ARC064 C - Boxes and Candies 先把每个盒子都消到x 然后从前往后推,要求第二个的上界是x-前一个 因为我们要求靠后的那个尽量小,会对后面的修改影响尽量小 #include ...
 - [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
		
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
 - [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 ...
 - [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二
		
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
 
随机推荐
- stm32 普通IO口模拟串口通信
			
普通IO口模拟串口通信 串口通信协议 串口传输 默认 波特率9600 1起始位 1停止位 其他0 数据位是8位(注意图上的给错了). 传输时,从起始位开始,从一个数据的低位(LSB)开始发送,如图从左 ...
 - python3 根据时间获取本月一号和月末日期
			
一.概述 有一个统计报表需求,需要知道上个月的第一天和最后一天,来进行上个月的数据统计. 二.代码实现 #!/usr/bin/env python3 # coding: utf-8 import ca ...
 - Git系列 —— 记一次Mac上git push时总是403的错误
			
问题: 今天从github上clone下一个项目,然后修改后git push时总是出现: remote:Permission to lixyou/rw-split-plugin.git defined ...
 - jQuery---jQ动画(普通,滑动,淡入淡出,自定义动画,停止动画),jQuery的事件,jQ事件的绑定/解绑,一次性事件,事件委托,事件冒泡,文档加载
			
jQuery---jQ动画(普通,滑动,淡入淡出,自定义动画,停止动画),jQuery的事件,jQ事件的绑定/解绑,一次性事件,事件委托,事件冒泡,文档加载 一丶jQuery动画 show,hide, ...
 - 从 Vue 的视角学 React(四)—— 组件传参
			
组件化开发的时候,参数传递是非常关键的环节 哪些参数放在组件内部管理,哪些参数由父组件传入,哪些状态需要反馈给父组件,都需要在设计组件的时候想清楚 但实现这些交互的基础,是明白组件之间参数传递的方式, ...
 - 从 Vue 的视角学 React(一)—— 项目搭建
			
虽然 Vue 在国内一家独大,但在全球范围内,React 依然是最流行的前端框架 最近和一些朋友聊天,发现很多项目都选择了 React 技术栈,而且公司的新项目也决定使用 React 我一直以来都是走 ...
 - Java深入学习(5):锁
			
可重入锁: 简单来说,支持重复加锁,有可重用性 特征:锁可以传递,方法递归传递 目的:避免了死锁现象 代码: public class Test implements Runnable { @Over ...
 - SpringBoot+Jpa+SpringSecurity+Redis+Vue的前后端分离开源系统
			
项目简介: eladmin基于 Spring Boot 2.1.0 . Jpa. Spring Security.redis.Vue的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 ...
 - MySQL登录时出现 Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES) 的原因及解决办法
			
场景一:调试web程序访问数据库的时候出现 场景二:MySQL登陆的时候,区分本地localhost登陆,以及远程登陆.即使本地能够登陆,如果不授权也无法远程登陆 分析原因:(区分)当本地出现这样的情 ...
 - Flink Time深度解析(转)
			
Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction.中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常 ...