結果
問題 | No.1036 Make One With GCD 2 |
ユーザー |
![]() |
提出日時 | 2020-04-25 11:10:06 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,130 ms / 2,000 ms |
コード長 | 1,258 bytes |
コンパイル時間 | 1,055 ms |
コンパイル使用メモリ | 75,652 KB |
実行使用メモリ | 15,488 KB |
最終ジャッジ日時 | 2024-09-16 13:41:17 |
合計ジャッジ時間 | 21,194 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 41 |
ソースコード
#include <iostream>#include <vector>long long gcd(long long a, long long b) {if (a == 0) return b;if (b == 0) return a;long long r = a % b;return r ? gcd(b, r) : b;}struct SegmentTree {int n;std::vector<long long> node;SegmentTree(const std::vector<long long>& A) {n = 1;while (n < A.size()) n *= 2;node.resize(n * 2 - 1);for (int i = 0; i < A.size(); i++)node[i + n - 1] = A[i];for (int i = n - 2; i >= 0; i--)node[i] = gcd(node[i * 2 + 1], node[i * 2 + 2]);}long long get(int a, int b, int k=0, int l=0, int r=-1) {if (r < 0) r = n;if (r <= a || b <= l) return 0;if (a <= l && r <= b) return node[k];return gcd(get(a, b, k * 2 + 1, l, (l + r) / 2),get(a, b, k * 2 + 2, (l + r) / 2, r));}};int main() {int N;std::cin >> N;std::vector<long long> A(N);for (int i = 0; i < N; i++)std::cin >> A[i];SegmentTree st(A);long long ans = 0;int i = 0, j = 1;while (i < N) {while (j <= N && st.get(i, j) != 1) j++;ans += N - j + 1;if (++i == j) j++;}std::cout << ans << "\n";}