BZOJ 1009 GT考试 DP+矩阵快速幂

2024-06-15 11:08
文章标签 bzoj 1009 gt dp 矩阵 考试 快速

本文主要是介绍BZOJ 1009 GT考试 DP+矩阵快速幂,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

dp[i][j]表示长度为i,匹配了j个的方案数,压缩成矩阵,转移即可。
#include <cstdio>
#include <cstring>
using namespace std;
struct Mat
{
int a[22][22];
};
Mat I, A;
int n, m, mod;
char s[22], ss[22];
Mat mul(Mat& x, Mat& y)
{
Mat z;
memset(z.a, 0, sizeof(z.a));
for(int i = 0; i < m; i++)
{
for(int j = 0; j < m; j++)
{
for(int k = 0; k < m; k++)
{
z.a[i][j] += x.a[i][k]*y.a[k][j];
z.a[i][j] %= mod;
}
}
}
return z;
}
void pow_mod(int x)
{
while(x)
{
if(x&1)
{
I = mul(I, A);
}
A = mul(A, A);
x >>= 1;
}
}
int main()
{
scanf("%d %d %d", &n, &m, &mod);
scanf("%s", s+1);
int l = strlen(s+1);
strcpy(ss+1, s+1);
for(int i = l-1; i >= 0; i--)
{
char c = ss[i+1];
for(int j = 0; j <= 9; j++)
{
s[i+1] = c;
if(j == s[i+1]-'0')
{
A.a[i+1][i]++;
continue;
}
s[i+1] = j+'0';
for(int k = i; k >= 0; k--)
{
if(k == 0)
{
A.a[k][i]++;
continue;
}
int t = i+1;
int k2;
for(k2 = k; k2 >= 1; k2--, t--)
{
if(s[k2] != s[t])
break;
}
if(k2 == 0)
{
A.a[k][i]++;
//printf("***%d %d\n", k, j);
//printf("%s", s+1);
break;
}
}
}
}   
/*for(int i = 0; i < m; i++)
{
for(int j = 0; j < m; j++)
printf("%d ", A.a[i][j]);
puts("");
}*/
memset(I.a, 0, sizeof(I.a));
for(int i = 0; i < m; i++)
I.a[i][i] = 1;
pow_mod(n);
int ans = 0;
for(int i = 0; i < m; i++)
{
ans += I.a[i][0];
ans %= mod;
}
printf("%d\n", ans);
return 0;
}

这篇关于BZOJ 1009 GT考试 DP+矩阵快速幂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1063281

相关文章

乐鑫 Matter 技术体验日|快速落地 Matter 产品,引领智能家居生态新发展

随着 Matter 协议的推广和普及,智能家居行业正迎来新的发展机遇,众多厂商纷纷投身于 Matter 产品的研发与验证。然而,开发者普遍面临技术门槛高、认证流程繁琐、生产管理复杂等诸多挑战。  乐鑫信息科技 (688018.SH) 凭借深厚的研发实力与行业洞察力,推出了全面的 Matter 解决方案,包含基于乐鑫 SoC 的 Matter 硬件平台、基于开源 ESP-Matter SDK 的一

LVGL快速入门笔记

目录 一、基础知识 1. 基础对象(lv_obj) 2. 基础对象的大小(size) 3. 基础对象的位置(position) 3.1 直接设置方式 3.2 参照父对象对齐 3.3 获取位置 4. 基础对象的盒子模型(border-box) 5. 基础对象的样式(styles) 5.1 样式的状态和部分 5.1.1 对象可以处于以下状态States的组合: 5.1.2 对象

【Spring】Spring Boot 快速入门

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 小杨近些在学习人工智能方面的知识,发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一

【教师资格证考试综合素质——法律专项】学生伤害事故处理办法以及未成人犯罪法笔记相关练习题

目录 《学生伤害事故处理办法》 第一章 总 则 第二章 事故与责任 (谁有错,谁担责) 第三章  事故处理程序 第四章 事故损害的赔偿 第五章 事故责任者的处理 第六章 附 则 《中华人民共和国预防未成人犯罪法》 第一章 总 则 第二章 预防犯罪的教育 第三章 对不良行为的干预 第四章 对严重不良行为的矫治 第五章 对重新犯罪的预防 第六章法律责任 第七章 附 则

上海邀请赛 A题目 HDU 5236(dp)

先求出没有ctrl+s的时候构造长度为i的期望f[i] 。然后枚举保存的次数,求出最小即可。 #include<cstdio>#include<cstdio>#include<cmath>#include<queue>#include<stack>#include<string>#include<cstring>#include<iostream>#include<map>

poj 3160 Father Christmas flymouse 强连通+dp

首先我们可以确定的是,对于val值小于0的节点都变成0.   假设一个集合内2个房间都能任意到达,那么我就可以吧集合内的所有点的价值都取到,并且可以达到任一点。实际上集合内的每个点是相同的,这样的集合就是一个强连通分量。 那么我们就可以用tarjin算法进行强连通缩点, 最后形成一个dag的图。在dag的图上面进行dp。可以先用拓扑排序后dp。或者建反响边记忆化搜索 。 VIEW

秋招突击——6/22——复习{区间DP——加分二叉树,背包问题——买书}——新作{移除元素、实现strStr()}

文章目录 引言复习区间DP——加分二叉树个人实现 背包问题——买书个人实现参考实现 新作移除元素个人实现参考思路 找出字符串中第一个匹配项的下标个人实现参考实现 总结 引言 今天做了一个噩梦,然后流了一身汗,然后没起来,九点多才起床背书。十点钟才开始把昨天那道题题目过一遍,然后十一点才开始复习题目,为了不耽误下午的时间,所以这里的就单纯做已经做过的题目,主打一个有量,不在学

Sublime Text 快速折叠CSS代码到一行

快速折叠CSS代码到一行 1.使用HTML/CSS/JS Prettify或者CSScomb美化代码 2.使用Alt+F3特征选取,删除下图中所有的特征空格 3.使用Ctrl+Shift+M选取括号里的内容,再使用一次Ctrl+Shift+M将大括号也一起选中。 4.使用Ctr+J折叠代码 5.Home键 6.Backspace键

一篇文章带你快速入门java

文章目录 一、一个简单的java代码1.1 Java程序的结构由三个不成组成:1.2 运行java程序1.3 JDK,JRE,JVM之间的关系?(面试题)1.4 标识符1.5 注释1.6 关键字 一、一个简单的java代码 public class HelloJava {public static void main(String[] args) {System.out.

汇编快速入门

一.基础知识 1.数据类型 DB(Define Byte,字节类型    占位8位bit == 1字节) 范围:DB可以用来定义(无符号、有符号)整数(包含二、十、十六进制)和字符 语法:a DB  数据个数  数据值 用法:a DB  -1 , 1 , 1000H , 'A' , "ABC" , ?(?是不知道的数值,一般机器自动使用0填充) DW(Define Word,字类型