class IpAddresses
{
public:
int dp[105][105];
string n;
int k;
bool cmp(string A, string B) {
if(A.size() > B.size()) {
return false;
}
if(A.size() < B.size()) {
return true;
}
if(A < B) {
return true;
}
if(A == B) {
return true;
}
return false;
}
int rec(int i, int br) {
if(i == n.size() - 1 and k == br) {
return 1;
}
if(i != -1 and dp[i][br] != -1) {
return dp[i][br];
}
int result = 0;
string tmp = "";
for(int j = i + 1; j < n.size(); j++) {
tmp += n[j];
if(tmp.size() >= 2 and tmp[0] == '0') {
continue;
}
if(cmp(tmp, "255")) {
result += rec(j, br + 1);
result %= 1000000007;
}
else {
break;
}
}
return dp[i][br] = result;
}
int count( string S, int K )
{
n = S;
k = K;
memset(dp, -1, sizeof dp);
return rec(-1, 0);
}
};