CF222E题解
这道题显然是一道 dp。转移方程式也很好推,我们记
但是一看
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 55
const int mod=1e9+7;
inline int read(){
int f=1,w=0;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
w=(w<<1)+(w<<3)+(c^48);
c=getchar();
}
return f*w;
}
int n,m,k;
bool vis[65][65];
struct matrix{
int a[65][65];
matrix operator *(const matrix &x)const{
matrix ans;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
ans.a[i][j]=0;
for(int k=1;k<=N;k++){
ans.a[i][j]=(ans.a[i][j]+a[i][k]*x.a[k][j]%mod)%mod;
}
}
}
return ans;
}
}base;
int trans(char c){
if(c>='a'&&c<='z'){
return c-'a'+1;
}else{
return c-'A'+27;
}
}
matrix f;
void quickpow(matrix base,int p,matrix &res){
while(p){
if(p&1) res=res*base;
p>>=1;
base=base*base;
}
}
matrix ans;
void init(){
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
base.a[i][j]=1;
}
}
for(int i=1;i<=N;i++){
ans.a[i][i]=1;
}
for(int i=1;i<=m;i++){
f.a[1][i]=1;
}
}
signed main(){
n=read();
m=read();
k=read();
init();
for(int i=1;i<=k;i++){
string s;
cin>>s;
int x,y;
x=trans(s[0]),y=trans(s[1]);
// vis[x][y]=1;
base.a[x][y]=0;
}
quickpow(base,n-1,ans);
f=f*ans;
int res=0;
for(int i=1;i<=m;i++){
(res+=f.a[1][i])%=mod;
}
cout<<res<<endl;
return 0;
}
本文作者:xxx2022
本文链接:https://www.cnblogs.com/xxx2022/p/17686731.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步