AOJ 1131 : Unit Fraction Partition
はじめに
ACM-ICPC 2年連続国内予選突破を目指して朝練を始めました。
- 寝坊
- IntelliJ Students License更新忘れ
- A問題なのに解けない
の3コンボ。泣きそう。思えば長いこと競プロしてない...。楽しいのになあ。
Unit Fraction Partition | Aizu Online Judge
2004 年のA問題。去年も朝練で解いた記憶があるけどどう解いていたか。
AIZU ONLINE JUDGE: Code Review
Fraction を作ろうとしていて、通分・約分をしている。
・・・。こんなの時間内でできないでしょ。A問題にそんな時間かけたくない。
大きくて1/12000 しか足さないので、浮動小数点でも解けるのでは?
import java.util.Arrays; import java.util.Scanner; public class Main { Scanner sc; Main() { sc = new Scanner(System.in); } int ni() { return sc.nextInt(); } public static void main(String[] args) { new Main().run(); } int a, n; int p, q; int dfs(int last, int sa, int sn, double sm) { if (sn > n) { return 0; } int cnt = 0; if (Math.abs(sm - (double) p / q) < 1e-9) { ++cnt; } if ((sm - (double) p / q) > 1e-9) { return 0; } for (int i = last; i <= a / sa; ++i) { cnt += dfs(i, sa * i, sn + 1, sm + 1.0 / i); } return cnt; } void run() { for (; ; ) { p = ni(); q = ni(); a = ni(); n = ni(); if (p == 0) { break; } System.out.println(dfs(1, 1, 0, 0)); } } void debug(Object... os) { System.err.println(Arrays.deepToString(os)); } }
(1e-6 にするとWAになります。)
AC。やったぜ。これ以上シンプルにならないのでは?(慢心)
と思って検索してみたら、以下を発見。圧巻。こういう考え方パパッとできるようにしたいなあ。