#include<bits/stdc++.h>

using namespace std;

int N, cnt[109];
char sir[109];
const int mod = 998244353;
const long long msk = (1LL << 50) - 1;
int add (int x, int y) {int ans = x + y; if (ans >= mod) ans -= mod; return ans;}
int subtract (int x, int y) {if (x >= y) return x - y; return x - y + mod;}
int mul (int x, int y) {return 1LL * x * y % mod;}
void adto (int &x, int y) {x += y; if (x >= mod) x -= mod;}

int power (int a, int b)
{
    int p = 1;
    for (int i=0; (1<<i) <= b; i++)
    {
        if (b & (1 << i)) p = mul (p, a);
        a = mul (a, a);
    }
    return p;
}
typedef pair < pair < long long, long long >, int > ss;
ss init;
bool getVal (ss x, int pos) {if (pos < 50) return (x.first.first >> pos) & 1; return (x.first.second >> (pos - 50)) & 1;}
pair < ss, ss > cut (ss big, int l)
{
//    if (big.second <= 50)
  //      return { {{big.first.first & ((1LL << l) - 1), 0}, l} , {{big.first.first >> l, 0}, big.second - l} };
    ss h1, h2;
    h1.second = l, h2.second = big.second - l;
    if (l <= 50) h1.first.first = big.first.first & ((1LL << l) - 1), h1.first.second = 0;
    else h1.first.first = big.first.first, h1.first.second = big.first.second & ((1LL << (l - 50)) - 1);

    if (l <= 50) h2.first.first = (big.first.first >> l) | ((big.first.second & ((1LL << l) - 1)) << (50 - l)), h2.first.second = big.first.second >> l;
    else h2.first.first = big.first.second >> (l - 50), h2.first.second = 0;
    return {h1, h2};
}
void print (ss x, string s) {for (int i=0; i<x.second; i++) printf ("%d", getVal (x, i)); printf ("%s", s.c_str ());}
ss operator & (ss a, ss b) {return {{a.first.first & b.first.first, a.first.second & b.first.second}, a.second};}

map < pair < long long, long long >, int > mp[109];
int nr;
pair < bool, int> getcode (ss x)
{
    bool nou = 0;
    int val = mp[x.second][x.first];
    if (val == 0)
        val = mp[x.second][x.first] = ++nr, nou = 1;
    return {nou, val};
}

pair < int, int > dp[5000009];
vector < int > divs[109];
pair < int, int > solve (ss init)
{
    if (init.second == 1)
    {
        if (init.first.first > 0) return {0, 2};
        return {0, 1};
    }
    ///sum of stuff, product of stuff
    pair < bool, int > pp = getcode (init);
    if (pp.first == 0) return dp[pp.second];
    int L = init.second, pos = pp.second;
    for (int i=1; i<L; i++)
    {
        pair < ss, ss > spt = cut (init, i);
        pair < int, int > dp1 = solve (spt.first), dp2 = solve (spt.second);
        adto (dp[pos].first, mul (dp1.second, dp2.first + dp2.second));
    }
    for (auto K : divs[L])
    {
        pair < ss, ss > spt = cut (init, L / K);
        ss curr = spt.second, nd = spt.first;
        while (curr.second > L / K)
            spt = cut (curr, L / K), nd = nd & spt.first,
            curr = spt.second;
        nd = nd & spt.second;
//        print (init, "= "), printf ("%d * ", K), print (nd, "\n");
        pair < int, int > ddp = solve (nd);
        adto (dp[pos].second, ddp.first + ddp.second);
    }
  //  print (init, " -> "), printf ("(%d, %d)\n", dp[pos].first, dp[pos].second);
    return dp[pos];
}

int main ()
{
//freopen ("input", "r", stdin);
//freopen ("output", "w", stdout);

scanf ("%s", sir), init.second = strlen (sir);
for (int i=0; i<init.second; i++)
    if (sir[i] == '1')
    {
        if (i < 50) init.first.first |= 1LL << i;
        else init.first.second |= 1LL << (i - 50);
    }
/*print (init, "\n");
pair < ss, ss > spt = cut (init, 70);
print (spt.first, "|"), print (spt.second, "\n");*/
cnt[1] = 1;
for (int i=2; i<=100; i++)
{
    cnt[i] = 1;
    for (int j=2; j<=i; j++)
        if (i % j == 0) divs[i].push_back (j), adto (cnt[i], cnt[i / j]);
}
pair < int, int > ans = solve (init);
printf ("%d\n", add (ans.first, ans.second));
return 0;
}


Measured memory_bytes: 4480