提交时间:2024-08-28 14:11:49
运行 ID: 31938
#include<bits/stdc++.h> using namespace std; #define int long long #define mod 998244353 int n,w,stot,pre; char s[200100]; struct Martix{ int a[3][3]; void mode1(){ memset(a,0,sizeof(a)); a[0][0]=a[0][1]=1; a[1][1]=a[1][2]=1; a[2][0]=a[2][2]=1; }void mode2(){ memset(a,0,sizeof(a)); a[0][0]=a[0][2]=1; a[1][0]=a[1][1]=1; a[2][1]=a[2][2]=1; }void mode3(){ memset(a,0,sizeof(a)); a[0][0]=a[1][1]=a[2][2]=2; }void init(){ memset(a,0,sizeof(a)); for(int i=0;i<=2;i++){ a[i][i]=1; } }void Clear(){ memset(a,0,sizeof(a)); } };Martix Plus(Martix a,Martix b){ Martix res; for(int i=0;i<=2;i++){ for(int j=0;j<=2;j++){ res.a[i][j]=0; for(int k=0;k<=2;k++){ res.a[i][j]=(res.a[i][j]+a.a[i][k]*b.a[k][j])%mod; } } }return res; }Martix qpM(int mode,int x){ Martix res,a;if(mode==1) a.mode1();if(mode==2) a.mode2();if(mode==0) a.mode3(); res.init(); while(x){ if(x&1){ res=Plus(res,a); }x>>=1; a=Plus(a,a); }return res; }int qp(int a,int x){ int res=1; while(x){ if(x&1){ res=(res*a)%mod; }x>>=1; a=(a*a)%mod; }return res; }void runsub1(){ int ans=1; for(int i=1;i<=stot;i++){ if((s[stot-i+1]-'0')%2==0){ //cout<<i<<'\n'; ans=(ans+qp(2,stot-i)*pre)%mod; } }cout<<ans<<'\n'; }void runsub2(){ int cnt[10],ans[10];memset(cnt,0,sizeof(cnt));memset(ans,0,sizeof(ans)); for(int i=1;i<=stot;i++){ cnt[s[i]-'0']+=n; }ans[0]=1; for(int i=1;i<=9;i++){ //cout<<ans[0]<<' '<<cnt[i]<<'\n'; Martix nownum;nownum.Clear(); for(int j=0;j<=2;j++){ nownum.a[0][j]=ans[j]; }nownum=Plus(nownum,qpM(i%3,cnt[i])); for(int j=0;j<=2;j++){ ans[j]=nownum.a[0][j]; } }cout<<ans[0]<<'\n'; }void runsub3(){ int ans=1; for(int i=1;i<=stot;i++){ if(s[stot-i+1]=='5') ans=(ans+qp(2,stot-i)*pre)%mod; }cout<<ans<<'\n'; }signed main(){ freopen("string.in","r",stdin); freopen("string.out","w",stdout); cin>>n>>w; char ch=' '; while(ch==' '||ch=='\n'){ch=getchar();} while('0'<=ch&&ch<='9'){ s[++stot]=ch; ch=getchar(); }pre=(qp(2,n*stot)-1)*qp(qp(2,stot)-1,mod-2)%mod; //cout<<pre<<'\n'; if(w==2){ runsub1(); }if(w==3){ runsub2(); }if(w==5){ runsub3(); } }