Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
39947 LYLAKIOIAKIOI 【S】T3 C++ 运行出错 0 2598 MS 3700 KB 2825 2026-02-09 20:18:13

Tests(0/25):


#include<bits/stdc++.h> #define pii pair<int,int> #define fi first #define se second #define mk make_pair #define ll long long #define ull unsigned long long #define ppc __builtin_popcountll #define ctz __builtin_ctzll using namespace std; const int MS=333,MS2=263111,mod=998244353; int qp(int a,int b){ int x=1; for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)x=1ll*x*a%mod; return x; } void Add(int &a,int b){a+=b;if(a>=mod) a-=mod;} void Sub(int &a,int b){a-=b;if(a<0) a+=mod;} int n,k,U; int a[MS][MS],b[MS][MS],c[MS][MS],bc[MS2],to[MS2]; bool chk(int S){ for(int i=0;i<k;i++){ int p=(i+1)%k; if(((S>>i)&1)&&((S>>p)&1)) return 0; }return 1; } bool iseq(int S,int T){ for(int i=0;i<k;i++){ int mask=(1<<i)-1; int TS=(S>>i)|((S&mask)<<(k-i)); if(TS==T) return 1; }return 0; } int solve(int _n,int _k){ n=_n,k=_k;U=(1<<k)-1; vector<int> I,ST; for(int i=0;i<=U;i++) bc[i]=0,to[i]=0; for(int i=0;i<=U;i++){ if(chk(i)){ I.push_back(i); bool flg=0; for(int j=0;j<ST.size();j++){ if(iseq(ST[j],i)){ bc[ST[j]]++;to[i]=j; flg=1;break; } } if(!flg){ bc[i]++;to[i]=ST.size(); ST.push_back(i); } } } for(int i=0;i<ST.size();i++){ for(int j=0;j<ST.size();j++){ a[i][j]=0;b[i][j]=(i==j); } } for(int i=0;i<ST.size();i++){ for(int j=0;j<I.size();j++){ if((ST[i]&I[j])==0){ a[i][to[I[j]]]=(a[i][to[I[j]]]+1)%mod; } } } U=ST.size()-1; for(;n;n>>=1){ if(n&1){ memset(c,0,sizeof(c)); for(int i=0;i<=U;i++){ for(int k=0;k<=U;k++){ for(int j=0;j<=U;j++){ c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%mod; } } } memcpy(b,c,sizeof(b)); } memset(c,0,sizeof(c)); for(int i=0;i<=U;i++){ for(int k=0;k<=U;k++){ for(int j=0;j<=U;j++){ c[i][j]=(c[i][j]+1ll*a[i][k]*a[k][j])%mod; } } } memcpy(a,c,sizeof(a)); } int res=0; for(int i=0;i<=U;i++) res=(res+b[0][i])%mod; return res; } void slv(){ int _n,_k; cin>>_n>>_k; cout<<solve(_n,_k)<<endl; } int main(){ //freopen("graph.in","r",stdin); //freopen("graph.out","w",stdout); ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); int t=1;//cin>>t; while(t--) slv();cerr<<clock()*1.0/CLOCKS_PER_SEC<<endl; return 0; }


测评信息: