#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
const ll mod = 998244353;
string S;
ll Precalc[105];
vector<int> Divisors[105];
ll just[101][101];
ll dp[101];
int N;
map<string, ll> mp, mp2;

ll g(string T);

ll f(string T) {
    if(mp[T] > 0) return mp[T];
    //cerr << "f: " << T << " " << T.size() << endl;
    ll ret = 0;
    for(auto len : Divisors[T.size()]) {
        ll factor = 1;
        string now;
        for(int k = 0; k < len; k++) {
            now.push_back('1');
        }
        for(int k = 0; k < T.size(); k++) {
            if(T[k] == '0') {
                now[k%len] = '0';
            }
        }
        /*
        for(int k = 0; k < now.size(); k++) {
            if(now[k] == '1') {
                factor = factor * 2 % mod;
            }
        }
        */
        //ll val = Precalc[T.size() / len];
        ll val = 1;
        val *= g(now);
        ret += val;
        ret %= mod;
    }
    //cerr << "f: " << T << " " << ret << endl;
    return mp[T] = ret;
}

ll g(string T) {
    if(mp2.count(T)) return mp2[T];
    ll ret = 0;
    for(int i = 1; i <= T.size(); i++) {
        ll tmp = f(T.substr(0, i));
        tmp *= g(T.substr(i, T.size()));
        tmp %= mod;
        ret += tmp;
    }
    ret %= mod;
    //cerr << "g: " << T << " " << ret << endl;
    return mp2[T] = ret;
}

int main() {
    //cout.precision(10);
    cin.tie(0);
    ios::sync_with_stdio(false);
    Precalc[1] = 1;
    mp2[""] = 1;
    mp[""] = 1;
    mp["0"] = 1;
    mp["1"] = 2;
    for(int i = 1; i <= 100; i++) {
        for(int j = 2; j * j <= i; j++) {
            if(i % j != 0) continue;
            Divisors[i].push_back(j);
            if(j * j != i) {
                Divisors[i].push_back(i / j);
            }
        }
        Divisors[i].push_back(1);
        sort(Divisors[i].begin(), Divisors[i].end());
        /*
        cerr << "--------" << i << "-------" << endl;
        for(auto val : Divisors[i]) {
            cerr << val << " ";
        }
        cerr << endl;
        */
        //cerr << Divisors[i].size() << endl;
    }
    for(ll i = 2; i <= 100; i++) {
        for(int j = 1; j < i; j++) {
            if(i % j == 0) Precalc[i] += Precalc[j];
        }
        //cerr << i << " " << Precalc[i] << endl;
    }
    //f("001001");
    cin >> S;
    cout << g(S) << endl;
    return 0;
    N = S.size();
    for(int i = 0; i < N; i++) {
        for(int j = i + 1; j <= N; j++) {
            /*
            for(auto len : Divisors[j-i]) {
                ll factor = 1;
                for(int k = 0; k < len; k++) {
                    bool AllOne = true;
                    for(int l = i + k; l < j; l += len) {
                        if(S[l] == '0') AllOne = false;
                    }
                    if(AllOne) factor = factor * 2 % mod;
                }
                just[i][j] += Precalc[(j-i)/len] * factor;
                just[i][j] %= mod;
            }
            */
            string tmp = S.substr(i, j - i);
            //cerr << i << " " << j << " " << tmp << endl;
            just[i][j] = f(tmp);
            //cerr << i << " " << j << " " << just[i][j] << endl;
        }
    }
    dp[0] = 1;
    for(int i = 1; i <= N; i++) {
        for(int j = 0; j < i; j++) {
            dp[i] += dp[j] * just[j][i];
            dp[i] %= mod;
        }
        //cerr << i << " " << dp[i] << endl;
    }
    cout << dp[N] << endl;
    return 0;
}


Measured memory_bytes: 12928