题意:

  给定 n,s,求有多少个字符集大小为 s ,长度为 n 的字符串,使得其不存在一个长度大于 1 的回文后缀

  答案对 m 取模。

分析:

  考场见到计数题的链式反应,想写暴力—>暴力难写—>不会暴力—>弃疗—>爆零。

  今天考试也不例外。但是逐渐思想过于摸化,没想到今天T2这么简单的一个递推,竟然不会写,我好弱啊,大概是学废了。

  对于这道题目,我们想到,后缀其实就是前缀(把字符串倒过来即可)我们设f[i]表示长度为i的满足题意的最长回文前缀是1的字符串有多少个,f[0]=1,在转移时,我们啥都不考虑,直接加一个字母。

  但是可能原串是这样的,最长回文前缀长度为1,我们加了一个字母之后,突然最长回文前缀长度就变成了i,比如“abbbbbb”最长回文前缀是1,但是,假如我们加入一个a,那么这个长度立刻就变成了8,我们就要把不和法的减去,所以考虑长度为p的回文串(不存在一个大于1的回文串是它的前缀)的数目,其实我们把把半个串确定了,整个回文串就确定了。

  所以方案数是f[ceil(i/2)],(ceil()函数代表向上取整)。

  最终的递推式子就是f[i]=f[i-1]*s-f[ceil(i/2)];

  别忘取模……

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ll long long
using namespace std;
const int N=;
ll f[N],m,n,k,s,w;
int main(){
scanf("%lld%lld%lld",&n,&s,&m);
f[]=;for(int i=;i<=n;i++)
f[i]=(f[i-]*s-f[(i+)>>])%m;
printf("%lld\n",f[n]%m);
return ;
}

dp

最新文章

  1. 《PHP数组函数》笔记
  2. 淘金客II项目问题日志(AngularJs+BootStrap+Api接口开发)
  3. Java中静态和非静态的区别
  4. ASP三种常用传值方式:
  5. LeetCode 263
  6. C++读写文件并排序
  7. Ubuntu 11.10 安装GMONE3,卸载 UNITY和UNITY 2D
  8. 201521123081《java程序设计》 第14周学习总结
  9. Java学习笔记16---抽象类与接口的浅显理解
  10. Java中简单Http请求
  11. jquery 实时监听输入框值变化方法
  12. node.js与ThreadLocal
  13. PX转REM简易计算器(适用于fittext.js插件计算)
  14. Python爬虫1-使用urlopen
  15. Ubuntu18.04下Python Web环境搭建
  16. 夜神模拟已开启,adb命令检测不了设备解决方法
  17. SQL Server 关于CROSS APPLY 和 OUTER APPLY应用
  18. C#导入Excel数据常见问题
  19. Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally如何使用尽可能少的标注数据来训练一个效果有潜力的分类器
  20. oracle 产生一个任意大小的随机数

热门文章

  1. UI: 网易新闻实现
  2. join示例分析
  3. 【爬坑系列】之解读kubernetes的认证原理&amp;实践
  4. [ZPG TEST 116] 最小边权和【生成树相关】
  5. 转 ORA-00054 的解决方法
  6. ABP教程(三)- 开始一个简单的任务管理系统 – 后端编码
  7. java IO流 复制图片
  8. php数组转为字符串,数据库存储
  9. ASP.NET Core MVC使用MessagePack配合前端fetch交换数据
  10. 30天自制操作系统 DAY6