結果
問題 |
No.1036 Make One With GCD 2
|
ユーザー |
|
提出日時 | 2022-10-17 20:32:54 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 271 ms / 2,000 ms |
コード長 | 1,970 bytes |
コンパイル時間 | 1,894 ms |
コンパイル使用メモリ | 202,164 KB |
最終ジャッジ日時 | 2025-02-08 07:44:51 |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#include <bits/stdc++.h> #define rep(i,n) for(int i = 0; i < (n); i++) using namespace std; typedef long long ll; template <class T, class Op> class SWAG { private: class node { public: T val, sum; node(const T &val, const T &sum) : val(val), sum(sum) {} }; Op op; std::stack<node> front_stack, back_stack; public: SWAG(const Op &op = Op()) : op(op), front_stack(), back_stack() {} bool empty() const { return front_stack.empty() && back_stack.empty(); } std::size_t size() const { return front_stack.size() + back_stack.size(); } T fold() const { assert(!empty()); if(front_stack.empty()) return back_stack.top().sum; if( back_stack.empty()) return front_stack.top().sum; return op(front_stack.top().sum, back_stack.top().sum); } void push(const T &x) { if(back_stack.empty()) { back_stack.emplace(x, x); } else { T s = op(back_stack.top().sum, x); back_stack.emplace(x, s); } } void pop() { assert(!empty()); if(front_stack.empty()) { front_stack.emplace(back_stack.top().val, back_stack.top().val); back_stack.pop(); while (!back_stack.empty()) { T s = op(back_stack.top().val, front_stack.top().sum); front_stack.emplace(back_stack.top().val, s); back_stack.pop(); } } front_stack.pop(); } }; int main(){ cin.tie(0); ios::sync_with_stdio(0); int N; cin >> N; vector<ll> A(N); rep(i,N) cin >> A[i]; auto op = [](ll x, ll y) { return gcd(x, y); }; SWAG<ll,decltype(op)> swag(op); ll ans = 0; for(int L = 0, R = 0; L < N; L++) { while(swag.empty() || R < N && swag.fold() != 1LL) swag.push(A[R++]); if(swag.fold() == 1LL) ans += N - R + 1; swag.pop(); } cout << ans << "\n"; }