bpeldi2oerkd8の開発日誌

とあるひよっこエンジニアの成長の記録。

AtCoder Beginner Contest 169に参加しました! (ABC169)

abc169_score
AtCoder Beginner Contest 169 (ABC169) に参加しました。
やってしまったな・・・という感じです。
感想を書いていきます。

ちなみに昨日の結果はこちらです。
developer-bpeldi2oerkd8.hatenablog.com

準備

昨日からの進捗はありません。

これが原因かなという感じです。

経過

A問題はとても簡単だったので、例を試さずに提出してACしました。

B問題ではオーバーフローをし、1WAしてしまいました。
オーバーフローするかもしれないけどまあいいか、と思って提出してしまったのですが、それが仇になりました。

C問題はdoubleの精度の問題だと思って、小数を100倍してから答えを100割ってWAでした。
なぜなんでしょうか。ちょっとわかりません。
結局BigDecimalを使って書き直し、ACしました。

D問題についてはエラトステネスの篩を応用すればできそうだと思いましたが、Nが10^12と大きいので配列だと扱えません。
何を思ったかNのルートまでを調べればいいと勘違いし、WA。
Nのルート以上でも素数があることに気づき、どうにかNまでの素数判定を実装しようとするも間に合いませんでした。
(どうやら素因数分解だったようですね。[23:11追加])

念のため、B問題とC問題の解答を載せておきます。(Javaですけど)

B問題

import java.util.Scanner;

public class Main {
	//java11

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		int N = sc.nextInt();
		long[] A = new long[N];
		for(int i=0; i<N; i++) {
			A[i] = sc.nextLong();
			if(A[i] == 0) {
				System.out.println(0);
				return;
			}
		}

		long ans = A[0];
		for(int i=1; i<N; i++) {
			if(A[i] <= (1000000000000000000L / ans)) {
				ans *= A[i];
			}else {
				System.out.println(-1);
				return;
			}
		}

		System.out.println(ans);

	}

}

C問題

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Scanner;

public class Main {
	//java11

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);

		String A = sc.next();
		String B = sc.next();

		BigDecimal bA = new BigDecimal(A);
		BigDecimal bB = new BigDecimal(B);
		BigDecimal ans = bA.multiply(bB);
		ans = ans.setScale(0, RoundingMode.DOWN);

		System.out.println(ans);

	}

}

結果

abc169_result
A~Cの3完です。
今回は痛いところを突く問題が多く、苦手なタイプの問題でした。
自分の勉強の甘さを強く感じました。

D問題は解けそうで解けないのがすごくもやもやしますね。
しっかりと復習したいと思います。


というわけで、ABC169の結果でした。
自分の甘さを感じて大反省という感じです。
今回のD問題はどの色の難易度かはわかりませんが、解くべき問題だったような気がするので、次回までには解けるようにしていきたいです。