【ARC064-F】【XSY2575】Rotated Palindromes(DP)(字符串)
Description
然而,由于小C沉迷于制作游戏,他完全忘记了自己作为国家集训队的一员,还有156道作业题等他完成。还有一天作业就要截止了,而他一题还没有做。于是他赶紧挑了一道看起来最简单的题:
“给定一个整数N,请你求出有多少字符集为1到K之间整数的字符串,使得该字符串可以由一个长度为N的回文串循环移位后得到。所谓循环移位,就是把字符串的某个前缀(可以为空)移到字符串末尾,如"1221"循环移位可以得到"1221"、"2211"、"2112"、"1122"四个字符串。结果对109+7取模。”
为了不让小C的集训队资格被CCF取消,请你帮助他完成这道题吧。
Input
第一行包含两个整数N,K。
Output
输出满足条件的字符串数对109+7取模的结果。
Sample Input
Sample Input 1
4 2
Sample Input 2
1 10
Sample Input 3
6 3
Sample Input 4
1000000000 1000000000
Sample Output
Sample Output 1
6
Sample Output 2
10
Sample Output 3
75
Sample Output 4
875699961
HINT
在第一个样例中,有"1111"、"1122"、"1221"、"2211"、"2112"、"2222",共6个字符串符合条件。
我们先考虑枚举回文串,因为回文串是回文的,所以我们只用枚举回文串的一半,回文串的个数就是\(m^{(n+1)/2}\)。
每一个回文串应该有\(n\)种循环移位后的到的字符串,但是这样计算后我们会发现这比答案大很多,因为有重复。
我们考虑如何计算不重复的字符串的个数,我们可以枚举回文串的循环节。
分两种情况讨论。
1.循环节为奇数
因为一个回文串的循环节必定为回文串,所以我们循环移位1个循环节的长度为\(len\)就会有重复,所以会产生\(len\)个新字符串。
2.循环节为偶数
因为上述的原因,循环节必定回文,我们只要有\(len/2\)的长度就会重复。
比如说,串\(122111221\),我们移了两位之后,串变成\(21122112\),虽然看起来与原串并不相同,但是我们在枚举回文串的时候,也会枚举到\(21122112\),所以也算重复。
接下来DP。
我们先预处理出\(n\)的所有因数,\(a[]\)
我们设\(dp[i]\)表示最小循环节为\(a[i]\)时,有多少个符合条件的回文串。
我们在\(dp[i]\)中减去\(dp[a[i]的因子]\),为了保证\(a[i]\)时最小的循环节。
ans就直接加上回文串所贡献的字符串个数即可。
#include<bits/stdc++.h>
#define mod 1000000007
#define int long long
using namespace std;
int dp[2010],cnt,n,k,a[2010],ans;
int fastpow(int x,int y)
{
int sum=1;
while(y)
{
if(y&1)
{
sum=(1ll*sum*x)%mod;
}
x=(1ll*x*x)%mod;
y>>=1;
}
return sum;
}
signed main()
{
scanf("%lld%lld",&n,&k);
for(int i=1;i*i<=n;i++)//枚举因子
{
if(n%i==0)
{
a[++cnt]=i;
if(i*i!=n)
{
a[++cnt]=n/i;
}
}
}
sort(a+1,a+cnt+1);
for(int i=1;i<=cnt;i++)
{
dp[i]=fastpow(k,(a[i]+1)/2);//有多少个回文串
for(int j=1;j<i;j++)
{
if(a[i]%a[j]==0)//去重
{
dp[i]=(dp[i]-dp[j]+mod)%mod;
}
}
if(a[i]&1)//统计答案
{
ans=(ans+dp[i]*a[i])%mod;
}else{
ans=(ans+dp[i]*(a[i]/2))%mod;
}
}
printf("%lld\n",ans);
return 0;
}
【ARC064-F】【XSY2575】Rotated Palindromes(DP)(字符串)的更多相关文章
- 【SDOI2018】反回文串(【ARC064 F】Rotated Palindromes 加强版)
题意 给你一个正整数 \(n\),求有多少字符集为 \(1\) 到 \(k\) 之间整数的字符串,使得该字符串可以由一个长度为 \(n\) 的回文串循环移位得到. ARC原题 \(100\%\) 的数 ...
- HDU - 4734 F(x) (数位dp)
For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n ...
- Educational Codeforces Round 56 (Rated for Div. 2) F - Vasya and Array dp好题
F - Vasya and Array dp[ i ][ j ] 表示用了前 i 个数字并且最后一个数字是 j 的方案数. dp[ i ][ j ] = sumdp [i - 1 ][ j ], 这样 ...
- UVA 11584 Partitioning by Palindromes (字符串区间dp)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- AtCoder Regular Contest 064 F - Rotated Palindromes
Problem Statement Takahashi and Aoki are going to together construct a sequence of integers. First, ...
- BZOJ3297: [USACO2011 Open]forgot DP+字符串
Description 发生了这么多,贝茜已经忘记了她cowtube密码.然而,她记得一些有用的信息.首先,她记得她的密码(记为变 量P)长度为L(1 <= L<=1,000)字符串,并可 ...
- [8.16模拟赛] 玩具 (dp/字符串)
题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...
- HDU 5763 Another Meaning dp+字符串hash || DP+KMP
题意:给定一个句子str,和一个单词sub,这个单词sub可以翻译成两种不同的意思,问这个句子一共能翻译成多少种不能的意思 例如:str:hehehe sub:hehe 那么,有**he.he** ...
- RQNOJ 514 字串距离:dp & 字符串
题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...
随机推荐
- 教老婆学Linux运维(二)Linux常用命令指南【下】
目录 tips:紧接上一篇,Linux常用命令指南[上] 2.4 文件解压缩 2.4.1 官宣的linux压缩工具:tar tar的基本命令格式为 tar [参数选项] [文件或目录] 我们前面学的命 ...
- netty源码解解析(4.0)-23 ByteBuf内存管理:分配和释放
ByteBuf内存分配和释放由具体实现负责,抽象类型只定义的内存分配和释放的时机. 内存分配分两个阶段: 第一阶段,初始化时分配内存.第二阶段: 内存不够用时分配新的内存.ByteBuf抽象层没有定义 ...
- 软件开发工具(第9章:使用Eclipse进行C/C++开发)
一.安装MinGW MinGW是指用来生成可执行文件的编译环境,它是开发C/C++项目 的工具集.为了能够使用Eclipse CDT编译且运行C和C++程序,必须 要安装一个C/C++编译器. 下载: ...
- Rust入坑指南:核心概念
如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...
- atomic_inc(&v)原子操作简述
atomic_inc(&v)对变量v用锁定总线的单指令进行不可分解的"原子"级增量操作,避免v的值由于中断或多处理器同时操作造成不确定状态. 原子操作 所谓原子操作,就是该 ...
- deferred对象和promise对象(二)---deferred对象
早上醒来,继续讨论deferred对象和primise对象. deferred对象的的方法: 1.$.Deferred()-----生成一个deferred对象 2.deferred.done()-- ...
- Redis高级应用解析:缓存穿透、击穿、雪崩
1 背景 像我们去面试一些大公司的时候,就会遇到一些关于缓存的问题.可能很多同学都是接触过,多多少少了解一些,但是如果没有好好记录这些内容,不熟练精通的话,在真正面试的时候,就很难答出来了. 在我们的 ...
- [NOIp2009] luogu P1072 Hankson 的趣味题
把 c 改成 d 下了两个点. 题目描述 已知正整数 a0,a1,b0,b1a_0,a_1,b_0,b_1a0,a1,b0,b1,设某未知正整数 xxx 满足: xxx 和 a0a_0a0 ...
- Luogu1119灾后重建
题目背景 BBB 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公 ...
- 实用---生命游戏 Java
本程序由四个类组成: 其中Init_data,用于初始化各个活细胞的状态judge_state,用于判断下一代的细胞状态,并进行更新.set_color,用于给GUI界面中各个细胞涂色set_fram ...