#include using namespace std; struct frac_t { int x, y; // constructors frac_t(void) { } frac_t(int a, int b = 1) { x = a; y = b; int r; while((r = a % b) != 0) { a = b; b = r; } x /= b; y /= b; } }; frac_t operator -(const frac_t &a, const frac_t &b) { return frac_t(a.x * b.y - a.y * b.x, a.y * b.y); } bool operator <(const frac_t &a, const frac_t &b) { return a.x * b.y < a.y * b.x; } bool operator ==(const frac_t &a, const frac_t &b) { return a.x == b.x && a.y == b.y; } int count(frac_t pq, int a_min, int a_max, int n) { if(n == 0) return 0; int c = 0; for(int i = a_min; i <= a_max; i++) { frac_t u(1, i); if(u < pq) c += count(pq - u, i, a_max / i, n - 1); else if(u == pq) ++c; } return c; } int main(void) { int p, q, a, n; while(cin >> p >> q >> a >> n) { if(p == 0 && q == 0 && a == 0 && n == 0) break; cout << count(frac_t(p, q), 1, a, n) << endl; } return 0; }