結果
| 問題 |
No.25 有限小数
|
| コンテスト | |
| ユーザー |
htensai
|
| 提出日時 | 2020-01-24 16:16:59 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 137 ms / 5,000 ms |
| コード長 | 1,863 bytes |
| コンパイル時間 | 2,351 ms |
| コンパイル使用メモリ | 78,508 KB |
| 実行使用メモリ | 54,216 KB |
| 最終ジャッジ日時 | 2024-09-14 03:42:58 |
| 合計ジャッジ時間 | 7,976 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 31 |
ソースコード
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
long m = sc.nextLong();
long g = gcd(n, m);
n /= g;
m /= g;
long x = m;
while(m % 10 == 0) {
m /= 10;
}
int base = 1;
while (x % 2 == 0) {
x /= 2;
base = 2;
}
while (x % 5 == 0) {
x /= 5;
base = 5;
}
if (x != 1) {
System.out.println(-1);
return;
}
if (m == 1) {
while (n % 10 == 0) {
n /= 10;
}
System.out.println(n % 10);
return;
}
ArrayDeque<Integer> deq = new ArrayDeque<>();
ArrayDeque<Integer> next = new ArrayDeque<>();
long y = n;
while(y > 0) {
deq.addFirst((int)(y % 10));
y /= 10;
}
while (m % base == 0) {
int last = 0;
boolean isFirst = true;
while (deq.size() > 0 || last != 0) {
int z = last * 10;
if (deq.size() > 0) {
z += deq.poll();
}
if (!isFirst || z / base != 0) {
next.add(z / base);
}
last = z % base;
isFirst = false;
}
ArrayDeque<Integer> tmp = next;
next = deq;
deq = tmp;
m /= base;
}
while (deq.getLast() == 0) {
deq.pollLast();
}
System.out.println(deq.getLast());
}
static long gcd(long x, long y) {
if (x % y == 0) {
return y;
} else {
return gcd(y, x % y);
}
}
}
htensai