问题描述

LG5337

BZOJ5508


题解

设\(opt_{i,j}(i \in [1,n],j \in [1,26])\)代表区间\([1,i]\),结尾为\(j\)的写法。

设\(exist_{i,j}(i,j \in [1,26])\)代表\((i,j)\)能否前后相邻,如果为\(1\),则不能。

则有

\[opt_{i,j}=\sum_{k=1}^{26} opt_{i-1,k}(exist_{k,j}=0)
\]

发现\(n \le 10^{15}\),就这样递推肯定不行,所以矩阵优化

矩阵\(base\)为\(26 \times 26\)的,\(base_{i,j}=1-exist_{i,j}\)


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; #define int long long template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-'){
fh=-1;ch=getchar();
}
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
} const int mod=1000000007LL; char s[100007];
int len,n;
int exist[27][27]; int chk(char c){
return c-'a'+1;
} struct Mat{
int a[27][27],n;
Mat(){
n=26;memset(a,0,sizeof(a));
}
}base,ans; Mat Mul(Mat a,Mat b){
int q=a.n;
Mat ret;
for(int i=1;i<=q;i++){
for(int j=1;j<=q;j++){
for(int k=1;k<=q;k++){
ret.a[i][j]=(ret.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
}
}
}
return ret;
} Mat ksm(Mat x,int p){
Mat ret;
for(int i=1;i<=26;i++) ret.a[i][i]=1;
while(p){
if(p&1) ret=Mul(ret,x);p>>=1;
x=Mul(x,x);
}
return ret;
} int sum; signed main(){
ios::sync_with_stdio(false);
cin>>n>>(s+1);
if(n==1){
puts("1");return 0;
}
len=strlen(s+1);
for(int i=2;i<=len;i++){
int xx=chk(s[i]),yy=chk(s[i-1]);
exist[yy][xx]=1;
}
for(int i=1;i<=26;i++){
ans.a[1][i]=1;
for(int j=1;j<=26;j++){
if(!exist[i][j]) base.a[i][j]=1;
}
}
ans=Mul(ans,ksm(base,n-1));
for(int i=1;i<=26;i++){
sum=(sum+ans.a[1][i])%mod;
}
cout<<sum<<endl;
return 0;
}

最新文章

  1. Oracle数据库升级(10.2.0.4-&gt;11.2.0.4)
  2. 搜索引擎广告过滤Chrome插件
  3. linux-shell笔记
  4. 小技巧:addobject: 和 addobjectsFromArray 的区别
  5. java 在linux环境下写入 syslog 问题研究
  6. json深度详解及org.json库
  7. Helloworld -SilverN
  8. Linux vim 底下显示行号
  9. Jquery的普通事件和on的委托事件小案例
  10. noip赛前小结2
  11. mysql优化(一)
  12. android 双卡手机发短信/判断手机是否为双卡
  13. 怎么在一个list集合里面筛选重复的数据,在重复的数据中取最后添加的那条数据
  14. JQuery使用mousedown和mouseup简单判断鼠标按下与释放位置是否相同
  15. Mac下redis的安装 以及配置支持PHP使用redis
  16. 元组tuple插入字符串的方式
  17. spring boot 集成disconf
  18. windows上安装Maven与Gradle
  19. vb.net Function使用
  20. Css下拉菜单设置

热门文章

  1. druid链接数据库
  2. c#串口通信并处理接收的多个参数
  3. solo升级以及自动化更新的方法
  4. 通过U盘在物理机安装CentOS出现Timeout的问题
  5. mybatis报错: java.lang.IllegalArgumentException invalid comparison: java.util.Date and java.lang.String
  6. 【tf.keras】TensorFlow 1.x 到 2.0 的 API 变化
  7. 微信小程序之POST请求
  8. SpringCloud(四):使用Feign实现声明式服务调用
  9. PHP学习—了解篇2
  10. Masonry纯码实现UIScrollView 之上下滚动,设置UIScrollView背景图片