这个用了double来判断相等与否,精度不太好把握,而且需要注意的东西也多一些
搜索顺下,t从小到大
剪枝 tmp>sum tmp为接下来所能选择的最大的分母,sum为剩下的值
(1/t)*n<sum 不再搜索 剩下的值都选最大仍不能满足
当乘积大于a时 退出
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
int ans;
double e=0.000000000001;
int dfs(double sum,int t,int n,double a)
{
// printf("%f %d %d %f\n",sum,t,n,a);
if(fabs(sum)<e)
{
if(a>=(1-e)) ans++;
return(0);
}
double tmp=(double)1/a;
if(tmp-e>sum) return(0);
for(int i=t;;i++)
{
double tmp=(double)1/(double)i;
if(tmp-e>sum) continue;
if(tmp*n+e<sum) break;
if(i-e>a) break;
dfs(sum-tmp,i,n-1,a/i);
}
}
int main()
{
int p,q,a,n;
while(1)
{
scanf("%d %d %d %d",&p,&q,&a,&n);
if(p==0&&q==0&&a==0&&n==0) break;
double sum=(double)p/(double)q;
ans=0;
dfs(sum,1,n,(double)a);
printf("%d\n",ans);
}
return 0;
}