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)(字符串)的更多相关文章

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

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

  2. 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  ...

  3. 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 ], 这样 ...

  4. UVA 11584 Partitioning by Palindromes (字符串区间dp)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  5. AtCoder Regular Contest 064 F - Rotated Palindromes

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

  6. BZOJ3297: [USACO2011 Open]forgot DP+字符串

    Description 发生了这么多,贝茜已经忘记了她cowtube密码.然而,她记得一些有用的信息.首先,她记得她的密码(记为变 量P)长度为L(1 <= L<=1,000)字符串,并可 ...

  7. [8.16模拟赛] 玩具 (dp/字符串)

    题目描述 儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟.小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼.也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老 ...

  8. HDU 5763 Another Meaning dp+字符串hash || DP+KMP

    题意:给定一个句子str,和一个单词sub,这个单词sub可以翻译成两种不同的意思,问这个句子一共能翻译成多少种不能的意思 例如:str:hehehe   sub:hehe 那么,有**he.he** ...

  9. RQNOJ 514 字串距离:dp & 字符串

    题目链接:https://www.rqnoj.cn/problem/514 题意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字 ...

随机推荐

  1. Transactional事务提交后触发异步方法

    一.问题复现 1.场景 2个service方法, 方法A中调用方法B. 方法A 是核心业务方法,涉及多张表数据变更,为了保持数据一致,用spring事务注解:@Transactional(rollba ...

  2. [Python] 豆瓣电影top250爬虫

    1.分析 <li><div class="item">电影信息</div></li> 每个电影信息都是同样的格式,毕竟在服务器端是用 ...

  3. 【MySQL】mysql5.7数据库的安装和配置

    第一步:直接从官网下载安装包,.msi 可以直接点击安装..zip直接解压到目录,本人是C:\Program Files\MySQL\mysql-5.7 第二步:需要配置环境变量,我的电脑->属 ...

  4. 从单片机到操作系统⑦——深入了解FreeRTOS的延时机制

    >没研究过操作系统的源码都不算学过操作系统 # FreeRTOS 时间管理 时间管理包括两个方面:系统节拍以及任务延时管理. ## 系统节拍: 在前面的文章也讲得很多,想要系统正常运行,那么时钟 ...

  5. python-犯傻合集

    1.题目: 基于文件实现用户登录程序,提示用户输入用户名和密码,检查用户名是否存在,以及用户名密码是否正确 保存密码的文件叫user.txt,内容:   |  作分隔符 阶段一: 自己第一次的答案: ...

  6. SecureCRT连接虚拟机下的CentOS7

    1.首先在VMWare下配置CentOS为桥接模式: 2.查看本机ip: 3.ip addr查看centos的mac地址: 4.在root权限下修改/etc/sysconfig/network-scr ...

  7. RAID5 配置,3块磁盘,2快备份

    1. 在虚拟机中再添加5块硬盘: 2. 用fdisk -l 可以查看当前虚拟机磁盘情况. 3. 使用mdadm命令创建RAID5,名称为”/dev/md0″. -C代表创建操作,-v显示创建过程,-n ...

  8. CH3801Rainbow的信号

    Description Freda发明了传呼机之后,rainbow进一步改进了传呼机发送信息所使用的信号.由于现在是数字.信息时代,rainbow发明的信号用N个自然数表示.为了避免两个人的对话被大坏 ...

  9. Codeforces1141F_Same Sum Blocks

    题意 给定一个序列,求最多的不相交区间满足区间和相同. 分析 从暴力的角度想,是枚举区间再求和,反过来想,直接记录每个和对应是那些区间,然后排个序求最大不相交即可. 代码 #include <b ...

  10. SDL建设-三方依赖库扫描

    说明: 本文首发自 https://www.secpulse.com/archives/73373.html,转载请注明出处. 文章综述 本文主要介绍Dependency-Check工具的工作原理和使 ...