#include<stdio.h>
#include<string.h>
struct node{
	int ch[2];
	bool vis;
	int dp;
};
node nn[1048576];
int num=0;
int add(int now,char* s)
{
	if(s[0]=='\0')
	{
		return now;
	}
	if(!nn[now].ch[s[0]-'0'])
	{
		num++;
		nn[now].ch[s[0]-'0']=num;
	}
	return add(nn[now].ch[s[0]-'0'],s+1);
}
char s[110][110];
int tmp[110][110];
int dfs(int now)
{
	int wz=add(0,s[now]);
	if(nn[wz].vis)
	{
		return nn[wz].dp;
	}
	int n=strlen(s[now]);
	for(int i=0;i<n;i++)
	{
		s[now+1][i]=s[now][i];
	}
	for(int i=n-1;i>=0;i--)
	{
		s[now+1][i]='\0';
		tmp[now][i]=dfs(now+1);
	}
	int ans=tmp[now][n-1];
	if(s[now][n-1]=='1')
	{
		ans<<=1;
		if(ans>=998244353)
		{
			ans-=998244353;
		}
	}
	for(int i=1;i<n;i++)
	{
		s[now+1][i]='\0';
		for(int j=0;j<i;j++)
		{
			s[now+1][j]='1';
		}
		for(int j=n-1;j>=0;j--)
		{
			int k=i-1-(n-1-j)%i;
			if(s[now][j]=='0')
			{
				s[now+1][k]='0';
			}
			if(k==0&&n-j>i)
			{
				ans+=(long long)tmp[now][j]*dfs(now+1)%998244353;
				if(ans>=998244353)
				{
					ans-=998244353;
				}
			}
		}
	}
	nn[wz].vis=true;
	nn[wz].dp=ans;
	return ans;
}
int main()
{
	nn[0].vis=true;
	nn[0].dp=1;
	scanf("%s",s[0]);
	printf("%d\n",dfs(0));
	return 0;
}