結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
|
提出日時 | 2020-04-24 22:16:20 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 342 ms / 2,000 ms |
コード長 | 3,052 bytes |
コンパイル時間 | 2,624 ms |
コンパイル使用メモリ | 197,260 KB |
最終ジャッジ日時 | 2025-01-09 23:58:27 |
ジャッジサーバーID (参考情報) |
judge2 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#include <bits/stdc++.h>#define REP(i, n) for(int i = 0;i < n;i++)#define ll long longusing namespace std;//typedef vector<unsigned int>vec;//typedef vector<ll>vec;//typedef vector<vec> mat;typedef pair<int, int> P;typedef pair<ll,ll> LP;const int dx[8] = {1, 0, -1, 0, 1, -1, -1, 1};const int dy[8] = {0, 1, 0, -1, 1, 1, -1, -1};const int INF = 1000000000;const ll LINF = 1000000000000000000;//1e18const ll MOD = 1000000007;const double PI = acos(-1.0);const double EPS = 1e-10;template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return true; } return false; }template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return true; } return false; }//template<class T> inline void add(T &a, T b){a = ((a+b) % MOD + MOD) % MOD;};template<class Monoid> struct SegTree {using Func = function<Monoid(Monoid, Monoid)>;const Func F;const Monoid UNITY;int SIZE_R;vector<Monoid> dat;SegTree(int n, const Func f, const Monoid &unity): F(f), UNITY(unity) { init(n); }void init(int n) {SIZE_R = 1;while (SIZE_R < n) SIZE_R *= 2;dat.assign(SIZE_R * 2, UNITY);}/* set, a is 0-indexed */void set(int a, const Monoid &v) { dat[a + SIZE_R] = v; }void build() {for (int k = SIZE_R - 1; k > 0; --k)dat[k] = F(dat[k*2], dat[k*2+1]);}/* update a, a is 0-indexed */void update(int a, const Monoid &v) {int k = a + SIZE_R;dat[k] = v;while (k >>= 1) dat[k] = F(dat[k*2], dat[k*2+1]);}/* get [a, b), a and b are 0-indexed */Monoid get(int a, int b) {Monoid vleft = UNITY, vright = UNITY;for (int left = a + SIZE_R, right = b + SIZE_R; left < right; left >>= 1, right >>= 1) {if (left & 1) vleft = F(vleft, dat[left++]);if (right & 1) vright = F(dat[--right], vright);}return F(vleft, vright);}inline Monoid operator [] (int a) { return dat[a + SIZE_R]; }/* debug */void print() {for (int i = 0; i < SIZE_R; ++i) {cout << (*this)[i];if (i != SIZE_R-1) cout << ",";}cout << endl;}};void solve(){int N;cin >> N;SegTree<long long> seg(N, [](long long a, long long b) {return gcd(a, b);},0);vector<long long> A(N);for (int i = 0; i < N; ++i) {cin >> A[i];seg.set(i, A[i]);}seg.build();ll ans = 0;int right = 0;for(int left=0;left<N;left++){while(right < N && seg.get(left, right + 1) != 1){++right;}ans += N - right;// cout << left << " " << right << endl;if(right == left) right++;}cout << ans << endl;}int main(){cin.tie(0);ios::sync_with_stdio(false);solve();// int T; cin >> T; REP(t,T) solve();}