■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 件のコメント:
コメントを投稿