結果
| 問題 | 
                            No.3026 Range LCM (Online Version)
                             | 
                    
| コンテスト | |
| ユーザー | 
                            👑  potato167
                         | 
                    
| 提出日時 | 2025-02-11 04:54:05 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                RE
                                 
                             
                            
                            (最新)
                                AC
                                 
                             
                            (最初)
                            
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,661 bytes | 
| コンパイル時間 | 2,772 ms | 
| コンパイル使用メモリ | 210,028 KB | 
| 実行使用メモリ | 41,272 KB | 
| 最終ジャッジ日時 | 2025-09-06 00:37:55 | 
| 合計ジャッジ時間 | 26,673 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | RE * 1 | 
| other | WA * 1 RE * 36 | 
ソースコード
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define all(p) (p).begin(),(p).end()
#include <atcoder/modint>
using mint = atcoder::modint998244353;
#include <atcoder/segtree>
mint op(mint a, mint b){
	return a * b;
}
mint e(){
	return 1;
}
vector<mint> solve_off(int N, vector<int> A, int Q, vector<int> L, vector<int> R){
	const int B = 200'200;
	vector<vector<int>> table(B);
	rep(i, 2, B) if (table[i].empty()){
		ll tmp = i;
		while (tmp < B){
			for (int j = tmp; j < B; j += tmp){
				table[j].push_back(tmp);
			}
			tmp *= i;
		}
	}
	vector<vector<int>> G(B);
	vector<int> ind(B);
	atcoder::segtree<mint, op, e> seg(N);
	rep(i, 0, N){
		int tmp = 1;
		for (auto x : table[A[i]]){
			if (G[x].empty()){
				tmp *= table[x].front();
			}
			G[x].push_back(i);
		}
		seg.set(i, tmp);
	}
    rep(i, 0, Q) L[i]--;
	vector<int> order(Q);
	rep(i, 0, Q) order[i] = i;
	sort(all(order), [&](int l, int r){
		return L[l] < L[r];
	});
	vector<mint> ans(Q);
	int l = 0;
	for (auto id : order){
		while (l < L[id]){
			for (auto x : table[A[l]]){
				ind[x]++;
				if (ind[x] < (int)G[x].size()){
					int a = G[x][ind[x]];
					seg.set(a, seg.get(a) * table[x].front());
				}
			}
			l++;
		}
		ans[id] = seg.prod(L[id], R[id]);
	}
    return ans;
}
int main(){
	ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int N;
    cin >> N;
    vector<int> A(N);
    rep(i, 0, N) cin >> A[i];
    int Q;
    cin >> Q;
    vector<int> L(Q), R(Q);
    rep(i, 0, Q) cin >> L[i] >> R[i];
    auto ans = solve_off(N, A, Q, L, R);
    for (auto x : ans){
        cout << x.val() << "\n";
    }
}
            
            
            
        
            
potato167