题目,考数学,求调代码,30pts,RE+WA
#include<bits/stdc++.h>
#define int long long
using namespace std;
char s[10005],Fl[207][10005],Fr[207][10005];
int n,len,p,ls[50000005],f[50000005];
signed main(){
scanf("%lld%lld%lld%s",&n,&len,&p,s);
Fl[0][0]=Fr[0][0]='0';
Fl[1][0]=Fr[1][0]='1';
ls[0]=ls[1]=1;
for(int i=2;i<=100;++i){
ls[i]=(ls[i-1]+ls[i-2])%p;
for(int j=0;j<ls[i];++j){
Fl[i][j]=(j<ls[i-1]?Fl[i-1][j]:Fl[i-2][j-ls[i-1]])%p;
Fr[i][j]=(j<ls[i-2]?Fr[i-2][j]:Fr[i-1][j-ls[i-2]])%p;
}
}
f[0]=f[1]=0;
if(len==1)f[s[0]-'0']=1;
for(int i=2;i<=n;++i){
f[i]=(f[i-1]+f[i-2])%p;
for(int j=1;j<len;++j)if(j<=ls[i-1]&&len-j<=ls[i-2]){
for(int k=0;k<len;++k)if(s[k]!=(k<j?Fr[i-1][j-1-k]:Fl[i-2][k-j]))goto o;
++f[i];
f[i]%=p;
o:;
}
}
printf("%lld\n",f[n]%p);
return 0;
}