結果
問題 | 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";}