BestCoder Round #75 1003 - King's Order
国王演讲后士气大增,但此时战争还没有结束,国王时不时要下发命令。 由于国王的口吃并没有治愈,所以传令中可能出现:“让第三军-军-军,到前线去” 这样的命令。由于大洋国在军队中安插了间谍 , 战事紧急,很多时候前线的指挥官不能分清哪些命令真正来自国王。但国王的命令有一个特点,他每次连续重复的字符最多 333 次. 所以说他的命令中没有:“让第三军-军-军-军 , 到前线去”,但是可以有 :“让第三军-军 , 到前线去” 。 此时将军找到了你,你需要告诉他,给定命令的长度长度为 n,有多少种不同的命令可以是国王发出的 。(也就是求长度为 n 的合格字符串的个数)当然,国王可能说出一句话没有犯任何口吃,就像他那次演讲一样。 为了简化答案,国王的命令中只含有小写英文字母,且对答案输出模 1000000007。 我们认为两个命令如果完全相同那么这两个字符串逐个比较就完全相同。
第一行一个整数表示测试组数:T(T≤10)T(T \le10)T(T≤10)。 每组数据占一行,每行一个正整数 n(n≤2000) 表示字符串的长度。
共 T 行,每行一个整数表示合法的命令数量。
2
2
4
676
456950
两个中没有不符合要求的,所以答案为 26×26=67626\times 26 = 67626×26=676 四个不符合要求的只有 `aaaa` `bbbb` ... `zzzz`总共 26 个 那么答案就是: 264−26=45695026^4-26 = 456950264−26=456950
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
const int mod=;
int t,n;
LL dp[][][],ans;
void fuc(){
for(int i=;i<=;i++)dp[][i][]=;
for(int i=;i<=;i++){
for(int j=;j<=;j++){
for(int k=;k<=;k++) if(j!=k) {
for(int p=;p<=;p++)
dp[i][j][]=(dp[i][j][]+dp[i-][k][p])%mod;
}
dp[i][j][]=dp[i-][j][];
dp[i][j][]=dp[i-][j][];
}
}
}
int main(){
memset(dp,,sizeof(dp));
fuc();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ans=;
for(int i=;i<=;i++){
for(int j=;j<=;j++)
ans=(ans+dp[n][i][j])%mod;
}
printf("%lld\n",ans);
}
}
d[i][j][k] 表示 第i 位串,以 字母 j 结尾, 最后面连续字母有 k 个 的数量。
d[i][j][2] 显然 由 d[i-1][j][1] 即前一位串以 j 结尾只有一个连续的推得;
同理 d[i][j][3] 由 的d[i-1][j][2] 推得
最后只有一个连续的 d[i][j][1] 显然只能由 其余 不同字母结尾 的串推得 d[i-1][k][1]+d[i-1][k][2]+d[i-1][k][3] k!=j;
然后因为每个字母都是等效的,也就是不同的 j 的存放的数据相同。
那把可以中间的j 拿掉
d[i][k] k=2,k=3 依旧同理
k=1 时即为前一值乘25得,因为是前一位子串其余不同字母结尾 d[i][1]= sum of d[i-1][k]*25 1<=k<=3;
最后统计答案 即 循环 26遍即可
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define LL long long
const int mod=;
int t,n;
LL dp[][],ans;
void fuc(){
dp[][]=;
for(int i=;i<=;i++){
for(int k=;k<=;k++)
for(int p=;p<=;p++)
dp[i][]=(dp[i][]+dp[i-][p])%mod;
dp[i][]=dp[i-][];
dp[i][]=dp[i-][];
}
}
int main(){
memset(dp,,sizeof(dp));
fuc();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ans=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
ans=(ans+dp[n][j])%mod;
printf("%lld\n",ans);
}
}
BestCoder Round #75 1003 - King's Order的更多相关文章
- BestCoder Round #75 1001 - King's Cake
Problem Description It is the king's birthday before the military parade . The ministers prepared a ...
- BestCoder Round #75 1002 - King's Phone
问题描述 阅兵式上,国王见到了很多新奇东西,包括一台安卓手机.他很快对手机的图形解锁产生了兴趣. 解锁界面是一个 3×33 \times 33×3 的正方形点阵,第一行的三个点标号 1,2,31, 2 ...
- hdu 5643 BestCoder Round #75
King's Game Accepts: 249 Submissions: 671 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 6 ...
- hdu 5641 BestCoder Round #75
King's Phone Accepts: 310 Submissions: 2980 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- BestCoder Round #75
前两题不想写了 数位DP 1003 King's Order 考虑i的后缀有j个连续,转移状态很简单,滚动数组优化(其实不用) #include <bits/stdc++.h> const ...
- 从lca到树链剖分 bestcoder round#45 1003
bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或) ...
- ACM学习历程—BestCoder Round #75
1001:King's Cake(数论) http://acm.hdu.edu.cn/showproblem.php?pid=5640 这题有点辗转相除的意思.基本没有什么坑点. 代码: #inclu ...
- BestCoder Round #75 King's Order dp:数位dp
King's Order Accepts: 381 Submissions: 1361 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 655 ...
- BestCoder Round #75 解题报告
King's Cake [思路] 递推 公式:f(n,m)=f(max(m,n-m),min(m,n-m))+1,n>m [代码] #include<cstdio> #include ...
随机推荐
- 数据库学习之ADO.NET五大对象
1 [ADO.NET] ado.net 是一种数据访问技术,使得应用程序能够连接到数据存储,并以各种方式操作存储在里面的数据. 2 [ADO.NET五大常用对象] Connec ...
- js 创建html元素 渲染html元素
var p1 = document.getElementById('p1'); //添加的元素类型及属性var newNode = document.createElement("input ...
- 关于继承扩展ASP.NET控件(以Textbox为例)
以下是一个相对简陋的扩展, 主要是针对金额显示的Textbox扩展. using System; using System.Collections.Generic; using System.Linq ...
- jQuery中$.getJSON的返回值问题
在使用$.getJSON获得数据库的返回值后,想将该值return传给其他函数.结果遇到问题. $.getJSON(url, data, function(result) { return resul ...
- VS2003,安装程序检测到另一个程序…
昨天在安装Visual Studio .Net 2003时,出现一个对话框 "安装程序检测到另一个程序要求计算机重新启动.必须重新启动计算机后才能安装visual studio.net系 ...
- C#操作注册表——读、写、删除、判断等基本操作
一.引入命名空间: using Microsoft.Win32; 二.创建注册表项:CreateSubKey(name)方法 添加SubKey时候首先要打开一个表项,并设置参数为true,才能成功创建 ...
- HDU 1056 - HangOver
递推 #include <iostream> using namespace std; ]; double c; int main() { f[]=; ;i<=;i++) f[i]= ...
- 浅说CPU并行计算与GPU并行计算
最近在学一门课,叫做“C++与并行计算”.要用到多CPU(进程)并行的原理,实现语言是C++的MPI接口.联想到上学期用到CUDA C/C++来做并行计算,就对这两门语言做一个总结,分享下自己关于并行 ...
- css3变形讲解
Transform变形:可以实现文字或者图片旋转.缩放.倾斜和移动,并且该元素下的所有子元素都随着父元素一样. 既然接触到transform,我们就可以做好多3d的效果啦 旋转:transform:r ...
- Android中使用开源框架android-image-indicator实现图片轮播部署
之前的博文中有介绍关于图片轮播的实现方式,分别为(含超链接): 1.<Android中使用ViewFlipper实现屏幕切换> 2.<Android中使用ViewPager实现屏幕页 ...