原题传送门

我们设计一个\(26*26\)的矩阵\(A\)表示\(a~z\)和\(a~z\)是否能够相邻,这个矩阵珂以由\(s1\)得出。答案显然是矩阵\(A^{len_{s2}-1}\)的所有元素之和,矩阵快速幂即可

#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
inline void write(register int x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
struct mat{
int a[26][26];
inline mat()
{
memset(a,0,sizeof(a));
}
inline mat operator*(const mat&b)const{
mat c;
for(register int i=0;i<26;++i)
for(register int j=0;j<26;++j)
for(register int k=0;k<26;++k)
c.a[i][j]=(c.a[i][j]+1ll*a[i][k]*b.a[k][j])%mod;
return c;
}
}s;
inline mat fastpow(register mat a,register ll b)
{
mat ret;
for(register int i=0;i<26;++i)
ret.a[i][i]=1;
while(b)
{
if(b&1)
ret=ret*a;
a=a*a;
b>>=1;
}
return ret;
}
ll n,ans;
char str[100005];
int main()
{
scanf("%lld%s",&n,str+1);
int len=strlen(str+1);
for(register int i=0;i<26;++i)
for(register int j=0;j<26;++j)
s.a[i][j]=1;
for(register int i=1;i<len;++i)
s.a[str[i]-'a'][str[i+1]-'a']=0;
mat res=fastpow(s,n-1);
for(register int i=0;i<26;++i)
for(register int j=0;j<26;++j)
ans=(ans+res.a[i][j])%mod;
write(ans);
return 0;
}

最新文章

  1. HTML学习笔记
  2. Linux下安装Apache并以mod_wsgi方式部署django站点
  3. 2016年AR行业十大热点事件汇总
  4. [Tex学习]WinEdit 常用软件快捷键
  5. Mac OS使用ll、la、l等ls的别名命令
  6. MVC如何在单独的类库中添加区域
  7. Oracle错误:ORA-01033
  8. 通过yum安装nginx-mysql-php-fastcgi配置LNMP
  9. 【狼】unity3d iTween插件的学习
  10. Obj-C的hello,world 1
  11. Python 第五篇(上):算法、自定义模块、系统标准模块(time 、datetime 、random 、OS 、sys 、hashlib 、json和pickle)
  12. MariaDB表表达式(2):CTE
  13. Excel init
  14. VMware Workstation安装Red hat7.0联网问题总结
  15. 抽象类练习(Job和TestJob)
  16. Hadoop记录- Yarn Job MAX
  17. Sprite组件和Button组件的使用
  18. ASP.NET -- 一般处理程序ashx
  19. SQL模糊查询排序问题
  20. 在asp.net中使用瀑布流,无限加载

热门文章

  1. javascript使用H5新版媒体接口navigator.mediaDevices.getUserMedia,做扫描二维码,并识别内容
  2. 【luoguP2986】[USACO10MAR]伟大的奶牛聚集Great Cow Gathering
  3. Xilinx ISE中Synplicity.ucf无法加上去的问题
  4. js之select三级联动
  5. java 备用待迁移
  6. Excel填坑[0]
  7. BaiduPCS-Go的安装及使用
  8. LiteIDE 设置默认编译输出位置
  9. 个人收集的Android开源项目
  10. 【转】SQL2008 链接Oracle 调用存储过程