HDU 5863 cjj's string game
$dp$,矩阵加速。
设$dp[i][j][0]$表示:长度为$i$的两个字符串,之前还未出现过长度为$m$相同的,目前为止最后$j$个是相同的。
设$dp[i][j][1]$表示:长度为$i$的两个字符串,之前已经出现过长度为$m$相同的,目前为止最后$j$个是相同的。
递推式很容易写,$n$有点大,矩阵加速。下图以$m=4$为例构造矩阵。
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
char c = getchar(); x = ;while(!isdigit(c)) c = getchar();
while(isdigit(c)) { x = x * + c - ''; c = getchar(); }
} LL n,MOD=;
int T,m,k; struct Matrix
{
long long A[][];
int R, C;
Matrix operator*(Matrix b);
}; Matrix X, Y, Z; Matrix cheng(Matrix a,Matrix b)
{
Matrix c;
int i, j, k;
for (i = ; i <= a.R; i++)
for (j = ; j <= b.C; j++){
c.A[i][j]=;
for (k = ; k <= a.C; k++)
c.A[i][j] = (c.A[i][j] + (a.A[i][k] * b.A[k][j]) % MOD) % MOD;
}
c.R = a.R; c.C = b.C;
return c;
} void init()
{
memset(X.A, , sizeof X.A);
memset(Y.A, , sizeof Y.A);
memset(Z.A, , sizeof Z.A); Y.R = *(m+); Y.C = *(m+);
for (int i = ; i <= *(m+); i++) Y.A[i][i] = ; X.R = *(m+); X.C = *(m+); for(int i=;i<=m;i++) X.A[i][]=k*(k-);
for(int i=;i<=m-;i++) X.A[i][i+]=k; for(int i=m+;i<=*m+;i++) X.A[i][m+]=k*(k-);
for(int i=m+;i<=*m+;i++) X.A[i][i+]=k;
X.A[m][*m+]=k; Z.R = ; Z.C = *(m+);
Z.A[][]=;
} void work()
{
while (n)
{
if (n % == ) Y = cheng(Y,X);
n = n >> ;
X = cheng(X,X);
}
Z = cheng(Z,Y);
LL ans=; for(int i=m+;i<=*(m+);i++) ans=(ans+Z.A[][i])%MOD;
printf("%lld\n",ans);
} int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%d%d",&n,&m,&k);
init();
work();
}
return ;
}
HDU 5863 cjj's string game的更多相关文章
- HDU 5863 cjj's string game (矩阵乘法优化递推)
题目大意:用k种字符构建两个长度为n的字符串(每种字符有无限多个),要求对应位置字符相同的连续子串最长长度为m,问方法数. 其中k,n,m是输入,n(1<=n<=1000000000), ...
- HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )
题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...
- HDU 5842 Lweb and String(Lweb与字符串)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
- hdu 4850 Wow! Such String! 欧拉回路
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4080264.html 题目链接:hdu 4850 Wow! Such String! 欧拉回 ...
- hdu 3553 Just a String (后缀数组)
hdu 3553 Just a String (后缀数组) 题意:很简单,问一个字符串的第k大的子串是谁. 解题思路:后缀数组.先预处理一遍,把能算的都算出来.将后缀按sa排序,假如我们知道答案在那个 ...
- HDU 4850 Wow! Such String!(欧拉道路)
HDU 4850 Wow! Such String! 题目链接 题意:求50W内的字符串.要求长度大于等于4的子串,仅仅出现一次 思路:须要推理.考虑4个字母的字符串,一共同拥有26^4种,这些由这些 ...
- HDU5863 cjj's string game(DP + 矩阵快速幂)
题目 Source http://acm.split.hdu.edu.cn/showproblem.php?pid=5863 Description cjj has k kinds of charac ...
- HDU 3336 Count the string(KMP的Next数组应用+DP)
Count the string Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 5842 Lweb and String (水题)
Lweb and String 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5842 Description Lweb has a string S ...
随机推荐
- jvm内存增长问题排查
jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...
- Linux实战教学笔记09:通配符
第九节 通配符 标签(空格分隔): Linux实战教学笔记 ---更多详细资料请点我查看 第1章 回顾特殊符号 | #管道符,或者(正则) > #输出重定向 >> #输出追加重定向 ...
- 《CLR Via C#》读书笔记,持续更新...
写了快5年代码了,一直都是使用别人发明的语言,别人发明的框架做快速开发,还从来没有真正深刻的学习过底层的一些东西,于是今年我打算读<CLR Via C#>这本书,认识一下C#的底层,我觉得 ...
- java后台接受app上传的图片
package com.sujinabo.file; import java.io.File; import java.io.FileOutputStream; import java.io.IOEx ...
- 【LeetCode】31. Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...
- junit 注意事项,切记
Junit 依赖于 hamcrest jar包,所以在用@Test注解的时候 junit-xxx.jar hamcrest-core-xx.jar hamcrest-library-xx.jar ...
- Substring (nyoj 308)
练习使用字符串函数了. 1.字串的反转也是它的字串,2.最长,3.最先出现 string: #include<iostream> #include<cstdio> #inclu ...
- Jstatd方式远程监控Linux下 JVM运行情况
前言 最近一个项目部署在服务器上运行时出现了问题,经过排查发现是java内存溢出的问题,所以为了实时监控服务器java内存的情况,需要远程查看服务器上JVM内存的一些情况.另外服务器系统是CentOS ...
- 一步步优化JVM四:决定Java堆的大小以及内存占用
到目前为止,还没有做明确的优化工作.只是做了初始化选择工作,比如说:JVM部署模型.JVM运行环境.收集哪些垃圾回收器的信息以及需要遵守垃圾回收原则.这一步将介绍如何评估应用需要的内存大小以及Java ...
- Uva 11889 Benefit (lcm与gcd)
题意:给你两个数,a,c,求出 lcm(a,b)==c 时的 b 的最小值 思路:我们知道一个性质 gcd(a,b)*lcm(a,b) = a*b 由此我们可以得到 b = gcd(a,b)*lcm( ...