結果

問題 No.1036 Make One With GCD 2
コンテスト
ユーザー arudo
提出日時 2026-07-29 14:17:26
言語 C++23
(gcc 15.2.0 + boost 1.90.0)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 268 ms / 2,000 ms
+ 300µs
コード長 1,089 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,505 ms
コンパイル使用メモリ 342,364 KB
実行使用メモリ 77,476 KB
最終ジャッジ日時 2026-07-29 14:17:43
合計ジャッジ時間 12,458 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge3_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 41
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <bits/stdc++.h> 

using i64 = long long; 
using u64 = unsigned long long; 
using u32 = unsigned; 

using u128 = unsigned __int128; 
using i128 = __int128; 

void solve() {
	int N; std::cin >> N;

	std::vector<i64> A(N);
	for(i64 & x: A) std::cin >> x;

	int K = 0; 
	while(1 << (K + 1) <= N) K ++;

	std::vector<std::vector<i64>> st(K + 1);

	st[0] = A;

	for(int i = 1; i < K + 1; i ++) {
		int m = N - (1 << i) + 1;
		st[i].resize(m);
		for(int j = 0; j < m; j ++) st[i][j] = std::gcd(st[i - 1][j], st[i - 1][j + (1 << (i - 1))]);
	}

	auto check =[&](int l, int r) -> bool {
		int lg = std::__lg(r - l + 1);
		return std::gcd(st[lg][l], st[lg][r - (1 << lg) + 1]) == 1;
	};

	i64 ans = 0;

	for(int i = 0; i < N; i ++) {
		int l = i, r = N - 1, R = N;
		while(l <= r) {
			int mid = l + (r - l) / 2;
			if(check(i, mid)) {
				r = mid - 1; R = mid;
			}
			else l = mid + 1;
		}

		ans += N - R;
	}

	std::cout << ans;
} 

int main() { 
	std::ios::sync_with_stdio(false); 
	std::cin.tie(nullptr); 

	int T = 1; 
	//std::cin >> T; 

	while (T--) { 
		solve(); 
	} 
	return 0; 
}
0