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)
}
この記事が気に入ったらサポートをしてみませんか?