AGC020E Encoding Subsets 题解
Coffee_zzz · · 题解
首先考虑对于一个确定的长度为
设
对于
对于
其中,
直接计算即可得到
接下来考虑如何计算长度为
同理,设
对于
对于
其中
记忆化搜索即可。有效状态数并不多,足以通过。
const int mod=998244353;
string s;
map <string,int> f,g;
void add(int &a,int b){
a+=b;
if(a>=mod) a-=mod;
}
int ad(int a,int b){
a+=b;
if(a>=mod) a-=mod;
return a;
}
int G(string s);
int F(string s){
if(s=="") return 1;
if(f.count(s)) return f[s];
int n=s.size(),ans=0;
for(int i=1;i<=n;i++) add(ans,1ll*G(s.substr(0,i))*F(s.substr(i,n-i))%mod);
return f[s]=ans;
}
int G(string s){
if(s=="") return 1;
if(s=="0") return 1;
if(s=="1") return 2;
if(g.count(s)) return g[s];
int n=s.size(),ans=0;
for(int d=1;d<n;d++){
if(n%d!=0) continue;
string t="";
for(int i=0;i<d;i++){
bool x=1;
for(int j=i;j<n;j+=d) x&=(s[j]=='1');
t+=x+'0';
}
add(ans,F(t));
}
return g[s]=ans;
}
void solve(){
cin>>s;
cout<<F(s)<<endl;
}