■1131 Unit Fraction Partition
自明な+ちょっと工夫した枝刈りでAC.
import java.util.*;
import java.lang.*;
import java.math.*;
import java.io.*;
import static java.lang.Math.*;
import static java.util.Arrays.*;
public class Main{
Scanner sc=new Scanner(System.in);
int INF=1<<28;
double EPS=1e-9;
int p0, q0, maxA, maxN;
int ans;
void run(){
for(;;){
p0=sc.nextInt();
q0=sc.nextInt();
maxA=sc.nextInt();
maxN=sc.nextInt();
if((p0|q0|maxA|maxN)==0){
break;
}
solve();
}
}
void solve(){
int gcd=gcd(p0, q0);
p0/=gcd;
q0/=gcd;
ans=0;
dfs(0, 1, 1, 1, 0);
// debug(ans);
println(""+ans);
}
void dfs(int p, int q, int qNow, int a, int n){
if(n>maxN){
return;
}
if(a>maxA){
return;
}
if(p*q0-q*p0>0){
return;
}
{
int p2=maxN-n;
int q2=qNow;
int pp=p*q2+q*p2;
int qq=q*q2;
if(pp*q0-qq*p0<0){
return;
}
}
// debug(p,q,qNow,a,n);
if(p==p0&&q==q0){
ans++;
return;
}
for(int i=qNow; i*a<=maxA; i++){
int p2=p*i+q;
int q2=q*i;
int gcd=gcd(p2, q2);
p2/=gcd;
q2/=gcd;
dfs(p2, q2, i, i*a, n+1);
}
}
int gcd(int m, int n){
for(; m!=0;){
int t=n%m;
n=m;
m=t;
}
return n;
}
void debug(Object... os){
System.err.println(Arrays.deepToString(os));
}
void print(String s){
System.out.print(s);
}
void println(String s){
System.out.println(s);
}
public static void main(String[] args){
// System.setOut(new PrintStream(new BufferedOutputStream(System.out)));
new Main().run();
}
}
0 件のコメント:
コメントを投稿