結果
問題 |
No.1084 積の積
|
ユーザー |
|
提出日時 | 2020-06-19 21:56:55 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,379 bytes |
コンパイル時間 | 2,095 ms |
コンパイル使用メモリ | 197,420 KB |
最終ジャッジ日時 | 2025-01-11 06:11:14 |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 WA * 1 |
other | AC * 23 WA * 4 |
ソースコード
#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) { assert(r > 0); 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 = Ans * solve(A) % mod; A.clear(); } else { A.emplace_back(x); } } if (!A.empty()) Ans = Ans * solve(A) % mod; cout << Ans << "\n"; return 0; }