[TJOI2019]甲苯先生的字符串——矩阵乘法+递推
题目链接:
我们用一个$26*26$的$01$矩阵记录任意两个字符是否能相邻。
设$f[i][j]$表示处理完前$i$个字符,第$i$个字符为$j$的方案数。
可以发现将$f[i]$这个$1*26$的矩阵与$26*26$的$01$矩阵相乘即可得到$f[i+1]$的矩阵。
直接将$01$矩阵矩乘即可。
注意题目中要求的不能相邻是指不能按原顺序相邻,即$s1$中有$ab$但$s2$中可以有$ba$。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int mod=1000000007;
struct lty
{
int a[27][27];
lty(){memset(a,0,sizeof(a));}
lty operator *(const lty &x)const
{
lty res=lty();
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
for(int k=1;k<=26;k++)
{
res.a[i][j]=(res.a[i][j]+1ll*a[i][k]*x.a[k][j]%mod)%mod;
}
}
}
return res;
}
};
int vis[27][27];
char s[100010];
ll n;
lty ans;
lty quick(ll n)
{
lty s=lty();
for(int i=1;i<=26;i++)
{
s.a[i][i]=1;
}
while(n)
{
if(n&1)
{
s=s*ans;
}
n>>=1;
ans=ans*ans;
}
return s;
}
int main()
{
scanf("%lld",&n);
scanf("%s",s+1);
int len=strlen(s+1);
for(int i=2;i<=len;i++)
{
vis[s[i-1]-'a'+1][s[i]-'a'+1]=1;
}
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
ans.a[i][j]=1-vis[i][j];
}
}
lty res=quick(n-1);
int ret=0;
for(int i=1;i<=26;i++)
{
for(int j=1;j<=26;j++)
{
ret=(ret+res.a[i][j])%mod;
}
}
printf("%d",ret);
}
[TJOI2019]甲苯先生的字符串——矩阵乘法+递推的更多相关文章
- BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维
求 $f[i][j]=∑f[i−1][k]$,$'a'<=k<='z'$ . 用矩阵乘法转移一波即可. 竟然独自想出来了QAQ Code: #include <bits/stdc++ ...
- HDU 4914 Linear recursive sequence(矩阵乘法递推的优化)
题解见X姐的论文 矩阵乘法递推的优化.仅仅是mark一下. .
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
- 【BZOJ-4547】小奇的集合 矩阵乘法 + 递推
4547: Hdu5171 小奇的集合 Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 175 Solved: 85[Submit][Status][D ...
- Luogu 1962 斐波那契数列(矩阵,递推)
Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...
- Ipad,IPhone(矩阵求递推项+欧拉定理)
Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- luogu题解 P1707 【刷题比赛】矩阵加速递推
题目链接: https://www.luogu.org/problemnew/show/P1707 分析: 洛谷的一道原创题,对于练习矩阵加速递推非常不错. 首先我们看一下递推式: \(a[k+2]= ...
- UVA 11464 偶数矩阵(递推 | 进制)
题目链接:https://vjudge.net/problem/UVA-11464 一道比较好的题目. 思路如下: 如果我们枚举每一个数字“变”还是“不变”,那么需要枚举$2^{255}$种情况,很显 ...
- 牛客练习赛63 牛牛的斐波那契字符串 矩阵乘法 KMP
LINK:牛牛的斐波那契字符串 虽然sb的事实没有改变 但是 也不会改变. 赛时 看了E和F题 都不咋会写 所以弃疗了. 中午又看了一遍F 发现很水 差分了一下就过了. 这是下午和古队长讨论+看题解的 ...
随机推荐
- js实现CheckBox全选或者不全选
<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server">< ...
- svn提交时把node_modules忽略掉
空白处右键>选中TortoiseSVN>设置(settings)>常规设置(General)>Subversion>编辑(edit)>在弹出的config文件中找g ...
- 【转载】Sqlserver中使用Round函数对计算结果四舍五入
在实际应用的计算中,很多时候我们需要对最后计算结果四舍五入,其实在Sqlserver中也有对应的四舍五入函数,就是Round函数,Round函数的格式为Round(column_name,decima ...
- UI5-技术篇-SEGW DEEP ENTITY测试
参考:http://blog.sina.com.cn/s/blog_a7d67d810102xgms.html 一般调用后端的OData服务需要同时传输多个记录表对业务逻辑进行处理(例如BAPI),今 ...
- ABAP Netweaver体内的那些寄生式编程语言
今天这篇文章的主题是:寄生. Jerry最近看到朋友圈里一位朋友分享的一张寄居蟹的照片,对于Jerry这种在内地长大的又很宅的人来说,没有机会看到寄居蟹,所以觉得很新鲜: 寄居蟹主要以螺壳为寄体,寄居 ...
- [LeetCode] 671. 二叉树中第二小的节点 ☆(递归 合并)
描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有 ...
- layui 添加
{include file="Public:inner_header" /} <link rel="stylesheet" href="__ST ...
- 配置多网卡多IP的方式
[root@web01 conf.d]# cat ip.conf server { listen 10.0.0.7:80; server_name _; location ...
- Nmap一些参数的具体作用
目标说明 1234 -iL <inputfilename> 读取文档-iR <hostnum> 随机选择目标--exclude <host1[,host2][,...]& ...
- k8s的认证授权
一.ServiceAccount Service account是为了方便Pod里面的进程调用Kubernetes API或其他外部服务而设计的.它与User account不同 User acc ...