結果
問題 | No.1084 積の積 |
ユーザー |
![]() |
提出日時 | 2020-06-19 23:06:35 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 64 ms / 2,000 ms |
コード長 | 2,652 bytes |
コンパイル時間 | 2,393 ms |
コンパイル使用メモリ | 196,356 KB |
最終ジャッジ日時 | 2025-01-11 07:48:23 |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 5 |
other | AC * 27 |
ソースコード
//#define DEBUGGING // Enables DEBUG macro.#include <bits/stdc++.h>using namespace std;using i64 = long long;using u64 = unsigned long long;#define REP(i, n) for (int i = 0; (i64)(i) < (i64)(n); ++i)#ifndef DEBUGGING#define debug(...)#define DEBUG(...)#elsetemplate <typename T>void debug(T value) {std::cerr << value;}template <typename T, typename... Ts>void debug(T value, Ts... args) {std::cerr << value << ", ";debug(args...);}#define DEBUG(...) \do { \cerr << " (L" << __LINE__ << ") "; \cerr << #__VA_ARGS__ << ": "; \debug(__VA_ARGS__); \cerr << endl; \} while (0)#endif// auto mod intconst i64 MOD = 1'000'000'007;struct mint {long long x;mint(long long x = 0) : x((x % MOD + MOD) % MOD) {}mint operator-() const { return mint(-x); }mint& operator+=(const mint a) {if ((x += a.x) >= MOD) x -= MOD;return *this;}mint& operator-=(const mint a) {if ((x += MOD - a.x) >= MOD) x -= MOD;return *this;}mint& operator*=(const mint a) {(x *= a.x) %= MOD;return *this;}mint operator+(const mint a) const { return mint(*this) += a; }mint operator-(const mint a) const { return mint(*this) -= a; }mint operator*(const mint a) const { return mint(*this) *= a; }mint pow(long long t) const {if (!t) return 1;mint a = pow(t >> 1);a *= a;if (t & 1) a *= *this;return a;}// for prime MODmint inv() const { return pow(MOD - 2); }mint& operator/=(const mint a) { return *this *= a.inv(); }mint operator/(const mint a) const { return mint(*this) /= a; }};istream& operator>>(istream& is, mint& a) { return is >> a.x; }ostream& operator<<(ostream& os, const mint& a) { return os << a.x; }int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int N;cin >> N;vector<i64> A(N);bool has_zero = false;for (auto& x : A) {cin >> x;if (x == 0) has_zero = true;}if (has_zero) {cout << 0 << endl;return 0;}int head = 0, tail = 0;mint ans = 1;mint cum = 1;i64 tmp = 1;while (head < N) {for (; tail < N; tail++) {if (tmp * A[tail] >= 1'000'000'000LL) {break;}tmp *= A[tail];cum *= tmp;ans *= tmp;}for (; head < N;) {cum *= mint(A[head]).inv().pow(tail - head);tmp /= A[head];head++;if (tmp < 1'000'000'000LL) {ans *= cum;}if (tail < N && tmp * A[tail] < 1'000'000'000LL) {break;}}}cout << ans << endl;}