剰余とるけどそのまま出力ではだめなの面白かった。$2$WAした。

  • すぐに飽和するので$0$になるまで回せばよい
  • $0$埋めはprintf("%012lld\n", x);が楽
#include <cstdio>
using ll = long long;
using namespace std;
int main() {
    ll n; scanf("%lld", &n);
    constexpr ll mod = 1e12;
    ll fact = 1;
    bool is_overflown = false;
    for (ll i = 0; fact and i < n; ++ i) {
        if (fact * (i+1) >= mod) is_overflown = true;
        fact = fact * (i+1) % mod;
    }
    printf(is_overflown ? "%012lld\n" : "%lld\n", fact);
    return 0;
}