首页 > 其他分享 >GT考试 [矩乘系列]

GT考试 [矩乘系列]

时间:2023-09-24 16:44:22浏览次数:38  
标签:矩乘 begin GT 25 int cdots bmatrix 考试 vdots

前言:

某人的要求,写一下题解。

这题折磨吗,不折磨,折磨吗,不折磨。所以宇宙万法的源头是什么?如如,所以折磨吗,如折。

题目传送门

解题思路:

首先,容易想到递推 $ n $ (矩乘不递推大的推什么?),枚举当前合法方案中的后缀再多出一个字符后是否会变的不合法。看到 $ m $ 的范围,尝试dp。

设 $ f_{i,j} $ 表示当前为第 $ i $ 位,有长度为 $ j $ 的不吉利数字的后缀的方案数,$ g_{i,j} $ 表示后缀长度为 $ i $ 的不吉利数字加上一个字符后变为后缀长度为 $ j $ 不吉利数字的方案数。我们就可以推出:

\[f_{i,j}= \sum_{k=0} ^{m}f_{i-1,k} \times g_{k,j} \]

这里的 $ g_{k,j} $ 根据定义显然是可以预处理的。但是我的评价是:暴力处理甚至都没有KMP好想。前缀匹配后缀那可不就是KMP吗!所以直接上KMP。

再接下来就是构造矩阵了。首先,$ m $ 的长度很小,所以可以构造一个 $ m \times m $ 大小的矩阵:

\[\begin{bmatrix} f_{i,0}\\f_{i,1}\\ \vdots \\f_{i,m-1}\end{bmatrix} \]

初态就是 $ f_{0,0}=1 $(空串),对应到矩阵上就是:

\[\begin{bmatrix}\,1 \,\\ \,0 \, \\ \, 0 \, \\ \, \vdots \, \\\,0 \, \end{bmatrix} \]

最重要的就是如何构造操作矩阵了。因为是 $ f_{i-1,k} \times g_{k,j} \to f_{i,j} $ 的,所以是由第 $ k $ 个转移到第 $ j $ 个,也就是第 $ k $ 行和第 $ j $ 列。所以操作矩阵异常的简单,就是:

\[\begin{bmatrix}g_{0,0},g_{0,1},\cdots ,g_{0,m-1}\\g_{1,0},g_{1,1},\cdots ,g_{1,m-1}\\ \vdots \\ g_{m-1,0},g_{m-1,1}, \cdots ,g_{m-1,m-1} \end{bmatrix} \]

上述即为:

\[\begin{bmatrix} f_{i+1,0}\\f_{i+1,1}\\ \vdots \\f_{i+1,m-1}\end{bmatrix} = \begin{bmatrix}g_{0,0},g_{0,1},\cdots ,g_{0,m-1}\\g_{1,0},g_{1,1},\cdots ,g_{1,m-1}\\ \vdots \\ g_{m-1,0},g_{m-1,1}, \cdots ,g_{m-1,m-1} \end{bmatrix} \times \begin{bmatrix} f_{i,0}\\f_{i,1}\\ \vdots \\f_{i,m-1}\end{bmatrix} \]

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define TP template<typename T>
#define TP_ template<typename T,typename ... T_>
TP void read(T &x)
{
	x=0;int f=1;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	x*=f;
}
TP_ void read(T &x,T_&...y){read(x);read(y...);}
TP void write(T x){if(x<0){putchar('-'),x=-x;}if(x>9)write(x/10);putchar(48+x%10);}
TP void writeln(T x){if(x<0){putchar('-'),x=-x;}if(x>9)write(x/10);putchar(48+x%10);puts("");}
TP_ void writeln(const T x,T_ ...y){write(x);putchar(' ');writeln(y...);}
typedef long long LL;
int n,m,P;
char s[25];
int p[25];
int match[25][25];
struct matrix
{
	LL a[25][25];
	matrix()
	{
		memset(a,0,sizeof(a));
	}
	friend matrix operator *(const matrix &A,const matrix &B)
	{
		matrix C;
		for(int i=1;i<=m;i++)
			for(int j=1;j<=m;j++)
				for(int k=1;k<=m;k++)
					C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j]%P)%P;
		return C;
	}
}F,f;
matrix qpow(matrix a,LL b)
{
	matrix ans;for(int i=1;i<=m;i++)ans.a[i][i]=1;
	for(;b;b>>=1)
	{
		if(b&1)ans=ans*a;
		a=a*a;
	}
	return ans;
}
void KMP()
{
	int len=strlen(s+1);
	p[1]=0;
	for(int i=2,j=0;i<=len;i++) 
	{
		while(j&&s[i]!=s[j+1])j=p[j];
		if(s[i]==s[j+1])j++;
		p[i]=j;
	}
	for(int i=0;i<m;i++) 
	{
		for(int j='0';j<='9';j++) 
		{
			int temp=i;
			while(s[temp+1]!=j&&temp)temp=p[temp]; 
			if(s[temp+1]==j)temp++; 
			match[i+1][temp+1]++; 
		}
	}
}
int main()
{
	read(n,m,P);
	scanf("%s",s+1);
	KMP();
	for(int i=1;i<=m;i++)
		for(int j=1;j<=m;j++)
			f.a[i][j]=match[i][j];
	F.a[1][1]=1;
	LL ans=0;
	F=F*qpow(f,n);
	for(int i=1;i<=m;i++)
		ans=(ans+F.a[1][i])%P;
	writeln(ans);
	return 0;
}

标签:矩乘,begin,GT,25,int,cdots,bmatrix,考试,vdots
From: https://www.cnblogs.com/lofty2007/p/17726167.html

相关文章

  • 计算机职称考试
    今天参加了职称考试,有很多不懂的希望记录一下在Excel2010中,按以下哪个选项输入,单元格内容会转换为逻辑值1.A输入T或FB.输入Y或Nc.输入yes或noD.输入TRUE或FALSED如果你在单元格中输入"TRUE"(不区分大小写)或"FALSE"(不区分大小写),Excel会自动将其解释为逻辑值,并在单元格中显......
  • SpringCloud --> 什么是微服务?
    微服务我们可以理解为是一种架构设计风格,就是将一个项目拆分成一个或者多个服务,每个服务都可以单独的运行,而且每个服务都会占用线程。从字面意思上我们可以理解为"微小的服务",我们从微小、服务来理解微小:强调的是单一项目的体积小,一个微服务通常只提供单个业务的功能,一个......
  • 2023年南京大学“飞迪计划”二次选拔考试题(数学)
    2023年南京大学“飞迪计划”二次选拔考试题(数学)Fiddie​【创作声明】本卷是观众投稿的回忆版,由Fiddie整理,转载请【您的文章推送开头的显眼地方用大字】注明来源:知乎Fiddie.请勿在您转载的文章背后插入过多的自己的广告!谢谢配合.如果同学们有类似的考试,欢迎回......
  • ! [rejected] master -> master (fetch first)
    ![rejected]master->master(fetchfirst)原因Git仓库中已经有一部分代码,所以它不允许你直接把你的代码覆盖上去。远程仓库和本地仓库存在差异。一般都是因为你在码云创建的仓库有ReadMe文件,而本地没有,造成本地和远程的不同步,解决方法:方法一、同步1、gitpull......
  • 考试程序语句总结
    1、导csv文件到hive数据库建表便于接收数据:createtabletest1(day_idvarchar(30),sale_nbrvarchar(30),buy_nbrvarchar(30),cntvarchar(30),roundvarchar(30))rowformatserde'org.apache.hadoop.hive.serde2.OpenCSVSerde'WITHSERDEPROPERTIES("separatorChar......
  • gtest测试框架
    GoogleTest简单使用googleTest是谷歌公司发布的一个跨平台的C++单元测试框架两种断言致命断言ASSERT_*:当断言失败时,产生致命错误,并终止当前函数非致命断言EXPECT_*:当断言失败时,产生非致命错误,并不会终止当前函数常用的断言ASSERTEXPECTVerifiesASSERT_TRUE(cond......
  • Si314 低功耗 14 通道电容触摸传感器,软硬件兼容替代GTX314L
    Si314是一款具有自动灵敏度校准功能的14通道电容传感器,其工作电压范围为1.8~5.5V。Si314设置休眠模式来节省功耗,此时,功耗电流为10uA@3.3V。Si314各个感应通道可实现独立使能、校准、灵敏度调节,可以确保可靠性,且具有自适应滤波功能,以应对各种噪音和环境变化。I2C串行接......
  • element中的<el-cascader>组件当值是0时不选中问题
    在element中的组件中,如果当前值是0时,无法显示。解决方法:将为0的值转换成字符串的0,即"0"。......
  • 基于Java+vue开发的企事业移动培训考试平台
    随着移动互联网的快速发展,越来越多的企业开始关注移动培训和考试平台的开发。为了满足这一需求,我们可以使用Java和Vue来开发一个基于移动端的企事业培训考试平台。获取方式Q+:262086839一、背景和需求企事业移动培训考试平台是一个基于Web的应用程序,旨在提供一个方便、高效的......
  • Exam DP-300: Administering Microsoft Azure SQL Solutions 微软Azure SQL Solutions
    作为该考试的考生,您应具备构建数据库解决方案方面的主题专业知识,这些解决方案旨在支持使用数据库构建的多种工作负载:企业内部SQLServerAzureSQL服务您是一名数据库管理员,负责管理使用SQLServer和AzureSQL服务构建的内部部署和云数据库。作为Azure数据库管理员,您......