#include <bits/stdc++.h>
using namespace std;
using ll = long long int;
#define inf 1000000000000000LL
#define mod 1000000007LL
#define FOR(i,a,b) for(int i = a; i < b; i++)
const ll Mod = 1000000009LL;
const ll Base = 271LL;
struct hashed_string{
private:
string s; ll n;
vector <ll> prefix;
vector <ll> pow;
public:
hashed_string(string a){
s = a; n = a.size();
prefix.assign(n, 0);
ll sum = 0;
pow.assign(n+1, 0);
pow[0] = 1;
for (int i = 1; i <= n; i++){
pow[i] = (pow[i-1] * Base) % Mod;
}
for (int i = 0; i < n; i++){
prefix[i] = ((sum * Base) % Mod + s[i] - 'a' + 1) % Mod;
sum = prefix[i];
}
}
ll get_hash(ll l, ll r){
ll x = prefix[r];
if (l >= 1){
l--;
x = ((x - prefix[l] * pow[r - l] % Mod) % Mod + Mod) % Mod;
}
return x;
}
};
void solve() {
string s1,s2;
cin >> s1 >> s2;
vector <ll> cnt(2,0);
for (int i = 0; i < s1.size(); i++){
cnt[s1[i] - '0'] += 1;
}
if (cnt[0] < cnt[1]){
string sub;
for (int i =0; i < s1.size(); i++) sub += (s1[i] == '0' ? '1' : '0');
swap(cnt[0], cnt[1]);
s1 = sub;
}
hashed_string v(s2);
ll answ = 0;
ll n = s2.size();
for (int i = 1; i <= n; i++){
if (cnt[0] * i > n) break;
vector <ll> w(2, -1);
if (cnt[1] == 0) continue;
if ((n - cnt[0] * i) % cnt[1] != 0) continue;
ll x0 = i;
bool flag = true;
ll x1 = (n - cnt[0] * i) / cnt[1];
if (x1 == 0 || x0 == 0){
continue;
}
int p = 0;
for (int j = 0; j < n;){
if (s1[p] == '0'){
if (v.get_hash(j, j + x0 - 1) != w[0] && w[0] != -1){
flag = false;
break;
}
w[0] = v.get_hash(j, j + x0 - 1);
j += x0;
}
else{
if (v.get_hash(j, j + x1 - 1) != w[1] && w[1] != -1){
flag =false;
break;
}
w[1] = v.get_hash(j, j + x1 - 1);
j += x1;
}
p++;
}
if (flag && w[0] != w[1]) answ++;
}
cout << answ << "\n";
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
ll t = 1;
while (t--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nIGludDsKI2RlZmluZSBpbmYgMTAwMDAwMDAwMDAwMDAwMExMCiNkZWZpbmUgbW9kIDEwMDAwMDAwMDdMTAojZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpID0gYTsgaSA8IGI7IGkrKykKY29uc3QgbGwgTW9kID0gMTAwMDAwMDAwOUxMOwpjb25zdCBsbCBCYXNlID0gMjcxTEw7CgpzdHJ1Y3QgaGFzaGVkX3N0cmluZ3sKICAgIHByaXZhdGU6CiAgICBzdHJpbmcgczsgbGwgbjsKICAgIHZlY3RvciA8bGw+IHByZWZpeDsKICAgIHZlY3RvciA8bGw+IHBvdzsKICAgIHB1YmxpYzoKICAgIGhhc2hlZF9zdHJpbmcoc3RyaW5nIGEpewogICAgICAgIHMgPSBhOyBuID0gYS5zaXplKCk7CiAgICAgICAgcHJlZml4LmFzc2lnbihuLCAwKTsKICAgICAgICBsbCBzdW0gPSAwOwogICAgICAgIHBvdy5hc3NpZ24obisxLCAwKTsKICAgICAgICBwb3dbMF0gPSAxOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CiAgICAgICAgICAgIHBvd1tpXSA9IChwb3dbaS0xXSAqIEJhc2UpICUgTW9kOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgICAgIHByZWZpeFtpXSA9ICgoc3VtICogQmFzZSkgJSBNb2QgKyBzW2ldIC0gJ2EnICsgMSkgJSBNb2Q7CiAgICAgICAgICAgIHN1bSA9IHByZWZpeFtpXTsKICAgICAgICB9CiAgICB9CiAgICBsbCBnZXRfaGFzaChsbCBsLCBsbCByKXsKICAgICAgICBsbCB4ID0gcHJlZml4W3JdOwogICAgICAgIGlmIChsID49IDEpewogICAgICAgICAgICBsLS07CiAgICAgICAgICAgIHggPSAoKHggLSBwcmVmaXhbbF0gKiBwb3dbciAtIGxdICUgTW9kKSAlIE1vZCArIE1vZCkgJSBNb2Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiB4OwogICAgfQp9Owp2b2lkIHNvbHZlKCkgewogICAgc3RyaW5nIHMxLHMyOwogICAgY2luID4+IHMxID4+IHMyOwogICAgdmVjdG9yIDxsbD4gY250KDIsMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IHMxLnNpemUoKTsgaSsrKXsKICAgICAgICBjbnRbczFbaV0gLSAnMCddICs9IDE7CiAgICB9ICAKICAgIGlmIChjbnRbMF0gPCBjbnRbMV0pewogICAgICAgIHN0cmluZyBzdWI7CiAgICAgICAgZm9yIChpbnQgaSA9MDsgaSA8IHMxLnNpemUoKTsgaSsrKSBzdWIgKz0gKHMxW2ldID09ICcwJyA/ICcxJyA6ICcwJyk7CiAgICAgICAgc3dhcChjbnRbMF0sIGNudFsxXSk7CiAgICAgICAgczEgPSBzdWI7CiAgICB9CiAgICBoYXNoZWRfc3RyaW5nIHYoczIpOwogICAgbGwgYW5zdyA9IDA7CiAgICBsbCBuID0gczIuc2l6ZSgpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKXsKICAgICAgICBpZiAoY250WzBdICogaSA+IG4pIGJyZWFrOwogICAgICAgIHZlY3RvciA8bGw+IHcoMiwgLTEpOwogICAgICAgIGlmIChjbnRbMV0gPT0gMCkgY29udGludWU7CiAgICAgICAgaWYgKChuIC0gY250WzBdICogaSkgJSBjbnRbMV0gIT0gMCkgY29udGludWU7CiAgICAgICAgbGwgeDAgPSBpOwogICAgICAgIGJvb2wgZmxhZyA9IHRydWU7CiAgICAgICAgbGwgeDEgPSAobiAtIGNudFswXSAqIGkpIC8gY250WzFdOwogICAgICAgIGlmICh4MSA9PSAwIHx8IHgwID09IDApewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaW50IHAgPSAwOwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjspewogICAgICAgICAgICBpZiAoczFbcF0gPT0gJzAnKXsKICAgICAgICAgICAgICAgIGlmICh2LmdldF9oYXNoKGosIGogKyB4MCAtIDEpICE9IHdbMF0gJiYgd1swXSAhPSAtMSl7CiAgICAgICAgICAgICAgICAgICAgZmxhZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfSAgIAogICAgICAgICAgICAgICAgd1swXSA9IHYuZ2V0X2hhc2goaiwgaiArIHgwIC0gMSk7CiAgICAgICAgICAgICAgICBqICs9IHgwOwogICAgICAgICAgICB9ICAgCiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICBpZiAodi5nZXRfaGFzaChqLCBqICsgeDEgLSAxKSAhPSB3WzFdICYmIHdbMV0gIT0gLTEpewogICAgICAgICAgICAgICAgICAgIGZsYWcgPWZhbHNlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd1sxXSA9IHYuZ2V0X2hhc2goaiwgaiArIHgxIC0gMSk7CiAgICAgICAgICAgICAgICBqICs9IHgxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHArKzsKICAgICAgICB9CiAgICAgICAgaWYgKGZsYWcgJiYgd1swXSAhPSB3WzFdKSBhbnN3Kys7CiAgICB9CiAgICBjb3V0IDw8IGFuc3cgPDwgIlxuIjsKfQoKaW50IG1haW4oKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGxsIHQgPSAxOwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIHNvbHZlKCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=