結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
![]() |
提出日時 | 2020-04-26 17:44:33 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 437 ms / 2,000 ms |
コード長 | 2,823 bytes |
コンパイル時間 | 1,620 ms |
コンパイル使用メモリ | 130,060 KB |
最終ジャッジ日時 | 2025-01-10 02:00:45 |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#include <algorithm>#include <bitset>#include <cassert>#include <cctype>#include <climits>#include <cmath>#include <complex>#include <cstdio>#include <cstring>#include <deque>#include <functional>#include <iomanip>#include <iostream>#include <map>#include <numeric>#include <queue>#include <random>#include <set>#include <stack>#include <string>#include <tuple>#include <vector>#include <list>#include <array>#define rep(i, n) for (int i = 0; i < (int)(n); ++i)//#define cerr if(false) cerr#ifdef DEBUG#define show(...) cerr << #__VA_ARGS__ << " = ", debug(__VA_ARGS__)#else#define show(...) 42#endifusing namespace std;using ll = long long;using pii = pair<int, int>;template <typename T, typename S>ostream& operator<<(ostream& os, pair<T, S> a) {os << '(' << a.first << ',' << a.second << ')';return os;}template <typename T>ostream& operator<<(ostream& os, vector<T> v) {for (auto x : v) os << x << ' ';return os;}void debug() {cerr << '\n';}template <typename H, typename... T>void debug(H a, T... b) {cerr << a;if (sizeof...(b)) cerr << ", ";debug(b...);}template<typename T>T gcd(T a, T b){while(b){a %= b;swap(a, b);}return a;}struct TwoStacks{using T = long long;struct Node{T val, sum;Node(const T &val, const T &sum):val(val), sum(sum){}};T merge(T l, T r){return gcd(l, r);}stack<Node> front, back;int size(){return front.size() + back.size();}T eval(){// assert(front.size() + back.size() > 0);if(!back.empty()){if(!front.empty()){return merge(front.top().sum, back.top().sum);}else{return back.top().sum;}}else{return front.top().sum;}}void pop_front(){// assert(front.size() + back.size() > 0);if(front.empty()){front.emplace(back.top().val, back.top().val);back.pop();while(!back.empty()){front.emplace(back.top().val, merge(back.top().val, front.top().sum));back.pop();}}front.pop();}void push_back(const T &val){if(!back.empty()){back.emplace(val, merge(back.top().sum, val));}else{back.emplace(val, val);}}};int main(){cin.tie(nullptr);ios::sync_with_stdio(false);int n;cin >> n;ll ans = (ll)n * (n + 1) / 2;TwoStacks ts;rep(i,n){ll x;cin >> x;ts.push_back(x);while(ts.size() and ts.eval()==1){ts.pop_front();}ans -= ts.size();}cout << ans << endl;}