結果
問題 | No.25 有限小数 |
ユーザー |
|
提出日時 | 2014-10-31 13:53:39 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 130 ms / 5,000 ms |
コード長 | 1,911 bytes |
コンパイル時間 | 3,621 ms |
コンパイル使用メモリ | 77,140 KB |
実行使用メモリ | 41,536 KB |
最終ジャッジ日時 | 2024-11-15 21:06:42 |
合計ジャッジ時間 | 8,304 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 31 |
ソースコード
import java.util.Scanner; public class Yuki025 { public static void main(String[] args) { Yuki025 p = new Yuki025(); } Yuki025() { Scanner scanner = new Scanner(System.in); long numerator = scanner.nextLong(); long denominator = scanner.nextLong(); System.out.println(solve(numerator, denominator)); } long gcd(long a, long b) { while (b > 0) { long c = a % b; a = b; b = c; } return a; } long pow(int v, int p, long init) { long ans = init % 10; for (int i = 0; i < p; i++) { ans *= v; ans %= 10; } return ans; } int getLastNonZero(long v) { long ans = v; while (ans % 10 == 0) { ans /= 10; } return (int) ans % 10; } int solve(long _numerator, long _denominator) { final long gcd = gcd(_numerator, _denominator); long numerator = _numerator / gcd; long denominator = _denominator / gcd; long num = denominator; if (num == 1) { return getLastNonZero(numerator); } int[] div = new int[6]; int[] divs = {2, 5}; for (int d : divs) { while (num > 1) { if (num % d > 0) { break; } div[d]++; num /= d; } } if (num > 1) { return -1; } final int diff = Math.max(div[5], div[2]) - Math.min(div[5], div[2]); if (div[5] == div[2]) { return (int) (numerator % 10); } else if (div[5] < div[2]) { return (int) pow(5, diff, numerator); } else { return (int) pow(2, diff, numerator); } } }