为什么样例能过交上去全输出0啊
查看原帖
为什么样例能过交上去全输出0啊
999274
CNS_5t0_0r2楼主2025/1/21 10:15
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9,SqrtN = 359,M = 1e5 + 9,V = 1e5 + 9,LOGV = 59,MOD = 998244353;
int n,m;
int a[N],max_a;
int prime[LOGV],top;
bitset<V> is_not_prime;
int qpow(int x,int y){
	int ret = 1;
	while(y){
		if(y & 1)
			ret = ret * x % MOD;
		x = x * x % MOD;
		y >>= 1;
	}
	return ret;
}
void sieve(){
    is_not_prime[0] = is_not_prime[1] = true;
	for(int i = 2;i <= max_a;i++){
		if(!is_not_prime[i])
			prime[++top] = i;
		for(int j = 1;j <= top && i * prime[j] <= max_a;j++){
			is_not_prime[i * prime[j]] = true;
			if(i % prime[j] == 0)
				break;
		}
	}
}
struct block{
	int l,r;
} b[SqrtN];
int block_len,block_cnt;
int belong[N];
void build_block(){
	block_len = 2000;
	block_cnt = (n + block_len - 1) / block_len;
	for(int i = 1;i <= block_cnt;i++){
		b[i].l = b[i - 1].r + 1;
		b[i].r = b[i].l + block_len - 1;
	}
	b[block_cnt].r = n;
	for(int i = 1;i <= block_cnt;i++)
		for(int j = b[i].l;j <= b[i].r;j++)
			belong[j] = i;
}
struct QUERY{
	int l,r;
	int id;
} q[N];
bool cmp(QUERY q1,QUERY q2){
	return (belong[q1.l] ^ belong[q2.l]) ? belong[q1.l] < belong[q2.l] : q1.r < q2.r;
}
int ans[M],tmp = 1;
int cnt[LOGV];
void add(int x){
	for(int i = 1;i <= top;i++){
		if(x % prime[i] == 0){
			if(cnt[i])
				tmp *= 1ll * prime[i] * cnt[i] % MOD;
			cnt[i]++;
		}
	}
	
}
void del(int x){
	for(int i = 1;i <= top;i++){
		if(x % prime[i] == 0){
			cnt[i]--;
			if(cnt[i])
				tmp *= qpow(1ll * prime[i] * cnt[i] % MOD,MOD - 2);
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin >> n >> m;
	for(int i = 1;i <= n;i++){
		cin >> a[i];
		max_a = max(max_a,a[i]);
	}
	sieve();
	for(int i = 1;i <= m;i++){
		cin >> q[i].l >> q[i].r;
		q[i].id = i;
	}
	sort(q + 1,q + m + 1,cmp);
	int lres = 1,rres = 0;
	for(int i = 1;i <= m;i++){
		int L = q[i].l,R = q[i].r;
		if(L == R){
			tmp = 1;
			ans[q[i].id] = tmp;
			continue;
		}
		while(lres > L)
			add(a[--lres]);
		while(lres < L)
			del(a[lres++]);
		while(rres < R)
			add(a[++rres]);
		while(rres > R)
			del(a[rres--]);
		ans[q[i].id] = tmp;
	}
	for(int i = 1;i <= m;i++) 
		cout << ans[i] << '\n';
	return 0;
}
2025/1/21 10:15
加载中...