結果
| 問題 |
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);
}
}
}