AtCoder ABC148 E -Double Factorial

AtCoderに取り組んだ記録です。
AtCoder ProblemsのRecommendationsからピックアップして解いています。

問題ページはこちらです。
Point: 500
Difficulty: 825

解説を読む前に考えたこと

自力ではACに至りませんでした。解説読むまでに考えていたのは以下のようなことです。

・末尾に10が何個つくか = 10で何回割り切れるかだと思う
・10で何回割り切れるかは、Nを構成する数( N, (N-2), ... 1)の中に存在する10で割り切れる数の個数とそれぞれの割り切れる回数(10なら1回、100なら2回など)を数えればよさそう

・Nが奇数の場合は、10で割り切れる数は存在しないため常に0になる

という感じで、答えは出そうな気もするけれど、実装には至らずでした。

解説を読んで学んだこと

・そもそもある数xが10で割れる回数は、xが2で割れる回数とxが5で割れる回数の小さい方の値である(xを素因数分解して2と5の指数の小さい方)
・N!が5で割れる回数は以下を計算して合算する(割る数はN以下)
 ・1,2,...N のうち、5で割れる数の個数
 ・1,2,...N のうち、5の2乗で割れる(5で2回割れる)数の個数
 ・1,2,...N のうち、5の3乗で割れる(5で3回割れる)数の個数
  …
・Nが偶数の場合、f(N) は 2のN/2乗と (N/2)!をかけたものになり、(N/2)!が5で割れる回数を数えることで解答になる

提出したコード

提出ページ

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	r := bufio.NewReader(os.Stdin)
	var n int
	fmt.Fscan(r, &n)

	if n%2 != 0 {
		fmt.Println(0)
		return
	}

	ans := 0
	divisor := 5
	for divisor <= n/2 {
		ans += n / 2 / divisor
		divisor *= 5
	}
	fmt.Println(ans)
}



この記事が気に入ったらサポートをしてみませんか?