結果
問題 | No.1084 積の積 |
ユーザー | potoooooooo |
提出日時 | 2020-06-19 22:03:59 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 29 ms / 2,000 ms |
コード長 | 1,331 bytes |
コンパイル時間 | 2,101 ms |
コンパイル使用メモリ | 196,336 KB |
最終ジャッジ日時 | 2025-01-11 06:22:24 |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 27 |
ソースコード
#include <bits/stdc++.h> using namespace std; constexpr int mod = 1000000007; constexpr long long M = 1e9; long long modpow(long long a, long long r) { long long ret = 1; while (r) { if (r & 1) ret = ret * a % mod; r >>= 1; a = a * a % mod; } return ret; } long long solve(vector<long long> &A) { int N = A.size(); long long curr = 1; long long Ans = 1; int l = 0; vector<long long> C(N+1, 0), D(N+1, 0); for (int i = 0; i < N; i++) { curr *= A[i]; while (curr >= M) { C[l] += i - l; D[l] += 1, D[i] -= 1; curr = curr / A[l]; l++; } } while (l < N) { C[l] += N - l; D[l] += 1, D[N] -= 1; l++; } for (int i = 0; i < N; i++) { Ans = Ans * modpow(A[i], C[i]) % mod; D[i+1] += D[i]; C[i+1] += C[i] - D[i]; } return Ans; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int N; cin >> N; vector<long long> A; long long Ans = 1; for (int i = 0; i < N; i++) { long long x; cin >> x; if (x == 0) { Ans = 0; } else { A.emplace_back(x); } } if (!A.empty() && Ans != 0) Ans = Ans * solve(A) % mod; cout << Ans << "\n"; return 0; }