🐙

ABC 148 | E - Double Factorial

2020/11/27に公開

問題

https://atcoder.jp/contests/abc148/tasks/abc148_e

考えたこと

問題文の定義より以下のようになる。

上記よりNが偶数のときはNまでの偶数の掛け合わせがf(N)の答えとなり、奇数のときはNまでの奇数の掛け合わせがf(N)の答えとなる。
末尾の連続する0を数えるにはf(N)10=5\times2がいつくあるか数えればいい。

Nが奇数の場合は2が出てくる事がないので答えは0である。

Nが偶数のときはNまでの偶数の数列の中で各数の約数の中で52の数を数えればいい。2の約数の数は明らかに5より多いので5の数のみを数えればいい。

気をつけるのは以下のように10 = 5 \times 25は1つだが、50 = 5 \times 5 \times 25は2つある。

偶数のみの数列なのでまずN2で割る。
それを5で割ると少なくとも1つの5の約数を持っている数字の数を出すことができる。
次にN25( = 5 \times 5)で割ると25の約数をもっている数字の数を出すことができる。
このようにしていけばNまでの奇数の数列の中で約数が5の合計数を数えることができ、それが末尾の連続する0の個数である。

コード

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const int MOD = 1e9 + 7;

int main() {
  ll n;
  cin >> n;
  if (n % 2 == 1) {
    cout << 0 << endl;
    return 0;
  }
  ll ans = 0;
  n /= 2;
  while (n > 0) {
    ll v = n / 5;
    ans += v;
    n /= 5;
  }
  cout << ans << endl;
}

参考

https://atcoder.jp/contests/abc148/tasks/abc148_e/editorial

Discussion