QOJ19007 2026 上海市赛 E 完美区间

完美区间 - 题目 - QOJ.ac

Note

给你长度为 $n$ 的整数序列 $S$,满足序列内元素两两互质,完成 $T$ 组查询或修改操作:

  • 查询:给你一个区间 $[l, r]$,问是否是一个完美区间;指的是,对于每一个数 $x$ 在区间内,我们记录他的出现次数是 $c_x$,都有 $c_x \mod{x} = 0$
  • 修改:把一个位置 $p$ 上的 $S_p := x$,保证修改后也是两两互质的

「约束」:$n, T \le 200000, \ \ x,S_i \le 10^8$

好牛逼的 Ad-hoc!

如果你能想到一个数 $x$ 出现了其值的倍数次数一定有 $x^{-1} \times c_x$ 是一个整数的话,你就自然可以想到:

然后你要能想到,如果两两互质的话,他乘起来就不会干扰,于是有:

这题就写完了,

你只需要维护一个 $x^{-1}$ 的任何一个可以修改查询前缀和的东西就行了

//no-unlocked

const ll M1 = 2013265921, M2 = 2281701377;
{
	int @n, @T;
	fenwick<ll> t1, t2;
	t1.malloc(n + 1); t1.init(n + 1); t2.malloc(n + 1); t2.init(n + 1);
	ll a[n];
	rep(i, n) {
		ll @x; a[i] = x;
		t1.add(i, powmod(a[i], M1 - 2, M1)); t2.add(i, powmod(a[i], M2 - 2, M2));
	}

	rep(T) {
		int @op;
		if(op == 0) {
			int @l, @r; l --, r --;
			ll r1 = t1.get(r), r2 = t2.get(r);
			ll l1 = t1.get(l - 1), l2 = t2.get(l - 1);
			wt((r1 - l1 + M1) % M1 == (r2 - l2 + M2) % M2 ? "yes" : "no");
		} else {
			int @p; ll @x; p --;
			t1.add(p, -powmod(a[p], M1 - 2, M1));
			t2.add(p, -powmod(a[p], M2 - 2, M2));
			a[p] = x;
			t1.add(p, powmod(a[p], M1 - 2, M1));
			t2.add(p, powmod(a[p], M2 - 2, M2));
		}
	}
}
// 代码是 clay