AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC148-E Double Factorial
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("12");
//1
}
else if (InputPattern == "Input2") {
WillReturn.Add("5");
//0
}
else if (InputPattern == "Input3") {
WillReturn.Add("1000000000000000000");
//124999999999999995
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long N = long.Parse(InputList[0]);
// Nが奇数の場合
if (N % 2 == 1) {
Console.WriteLine(0);
return;
}
N /= 2;
long Answer = 0;
long Div = 5;
while (true) {
long Syou = N / Div;
if (Syou == 0) break;
Answer += Syou;
Div *= 5;
}
Console.WriteLine(Answer);
}
}
解説
前提知識として、任意の自然数の末尾に付く0の数は、
素因数分解した時の、
min ( 2の乗数 , 5の乗数) になります。
Nが奇数の場合は、
f(21) = 21 * 19 * 17 * 15 * 13 * 11 * 9 * 7 * 5 * 3 * 1
で約数に2が無いので、解は0になります。
Nが偶数の場合は、
f(20) = 20 * 18 * 16 * 14 * 12 * 10 * 8 * 6 * 4 * 2
で、2で因数分解すると
2のX乗 * ( 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1)
= 2のX乗 * ( 10 の階乗 )
となり、
10の階乗を素因数分解した時の、2の乗数 <= 5の乗数 が成り立つので、
10の階乗を素因数分解した時の、5の乗数が解になります。
YouTube 【整数の性質が超わかる!】◆階乗と整数の性質