1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include<iostream> #include<cstdio> #include<cstring> using namespace std;
const int N=2e5+10,mod=998244353; int n; char s[N]; int a[N]; int f[N][2][2][2][2][2][2]; inline int adj(int x){return x>=mod?x-mod:x;} int dfs(int pos,bool l1,bool l2,bool l3,bool x,bool y,bool z) { if(pos>n)return x&&y&&z; int &res=f[pos][l1][l2][l3][x][y][z]; if(~res)return res; res=0; for(int i=0;i<=(l1?a[pos]:1);i++) for(int j=0;j<=(l2?a[pos]:1);j++) for(int k=0;k<=(l3?a[pos]:1);k++) res=adj(res+dfs(pos+1,l1&&(i==a[pos]),l2&&(j==a[pos]),l3&&(k==a[pos]), x||((i^j)+(i^k)>(j^k)),y||((j^i)+(j^k)>(i^k)),z||((k^i)+(k^j)>(i^j)))); return res; } int main() { scanf("%s",s+1); n=strlen(s+1); for(int i=1;i<=n;i++)a[i]=s[i]-'0'; memset(f,-1,sizeof(f)); printf("%d\n",dfs(1,1,1,1,0,0,0)); return 0; }
|