結果
| 問題 | No.8123 Calculated N ! | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2025-03-30 13:38:39 | 
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) | 
| 結果 | 
                                TLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 1,027 bytes | 
| コンパイル時間 | 3,167 ms | 
| コンパイル使用メモリ | 279,456 KB | 
| 実行使用メモリ | 10,916 KB | 
| 最終ジャッジ日時 | 2025-04-01 20:51:15 | 
| 合計ジャッジ時間 | 9,723 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 6 | 
| other | AC * 15 TLE * 1 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/modint>
using mint = atcoder::modint1000000007;
using ll = long long;
using vl = vector<ll>;
mint helper(ll n, ll x) {
	mint v = 1;
	while (n) v += n /= x;
	return v;
}
int main() {
	ll n;
	cin >> n;
	
	ll sq = 1;
	while (sq * sq <= n) sq++;
	sq--;
	ll nsq = n / sq;
	int m = nsq + sq;
	
	vl f(m, 0);
	for (ll i = 1; i <= sq; i++) f[m - i] = n / i - 1;
	for (ll i = 1; i < nsq; i++) f[i] = i - 1;
	for (ll p = 2; p <= sq; p++) {
		if (f[p] == f[p - 1]) continue;
		ll q = f[p - 1], pp = p * p;
		for (ll i = 1; i <= sq && n / i >= pp; i++) {
			ll ip = i * p;
			f[m - i] -= f[ip <= sq ? m - ip : n / ip] - q;
        }
		for (ll i = n / sq - 1; i >= pp; i--)
			f[i] -= f[i / p] - q;
	}
	
	mint ans = 1;
	ll prv = f[1];
	for (ll i = 2; i < nsq; i++) {
		ll cnt = f[i];
		ans *= helper(n, i).pow(cnt - prv);
		prv = cnt;
	}
	for (ll i = sq; i; i--) {
		ll cnt = f[m - i];
		ans *= helper(n, n / i).pow(cnt - prv);
		prv = cnt;
	}
	cout << ans.val() << "\n";
}
            
            
            
        