#include #include #include #include #define MAX 50 char s[MAX],base[MAX],num[MAX]; int len,blen,mlen; int ul,i,j,k; int check; long long total; long long P[MAX]; long long bnum, nnum; int valid(char * v) { if (strlen(v)<=1) return 1; if (v[0]=='0') return 0; else return 1; } int main() { while (1) { scanf("%s\n",s); if (s[0] == '#') break; /* printf("[%s]\n",s); */ len = strlen(s); total = 0; for (blen=1; blen<=len-1; blen++) { strcpy(base,s+(len-blen)); bnum=0; check=0; if (base[0] == '0') continue; if (blen <= (len/2)) { check=1; bnum = atoll(base); } /* printf("base: [%s] blen: [%d] (for sure [%s])\n",base,blen,s); */ P[0]=1; for(ul=1; ul<=(len-blen); ul++) { mlen=ul; if (mlen>blen) mlen=blen; P[ul]=0; for(i=1; i<=mlen; i++) { if ((i>1) && (s[ul-i]=='0')) continue; if (check) { strncpy(num,s+(ul-i),i); num[i]=0; nnum=atoll(num); /* printf("bnum = %lld\n",bnum); printf("nnum = %lld\n",nnum); */ if (nnum >= bnum) continue; } P[ul]+=P[ul-i]; } /* printf("P[%d] = %lld\n",ul,P[ul]); */ } /* printf("base [%s] -> numbers [%d]\n",base,P[len-blen]); */ total += P[len-blen]; } if (total == 0) printf("The code %s is invalid.\n",s); else printf("The code %s can represent %lld numbers.\n",s,total); } return 0; }