首页 > 其他分享 >【拆贡献】CF1422F Boring Queries

【拆贡献】CF1422F Boring Queries

时间:2023-08-28 20:11:11浏览次数:37  
标签:rt int Boring rep Queries CF1422F res ocr mod

考虑质因数分解,我们求区间的 \(lcm\) 就是 \(\prod a_i\) 除以一些东西。

不难发现如果算 \(x^k \in lcm\) 那么我们只能算一次,那么我们直接把这个东西挂在前一个出现的位置即可。

使用主席树维护即可。这个题,很难。

// LUOGU_RID: 123092767
#include <bits/stdc++.h>
#define rep(i, l, r) for (int i = l; i <= r; i ++)
#define per(i, r, l) for (int i = r; i >= l; i --)
#define cpy(x, y, s) memcpy(x, y, sizeof(x[0]) * (s))
#define mem(x, k) memset(x, k, sizeof(x))
#define ll long long

// \yhx-12243/ 鱼大保佑!!

using namespace std;

const int _ = 2e5 + 5, mod = 1e9 + 7;

int M = 2e5;
int pr[_], inv[_];

int n, q, a[_], ocr[_];
int power (int x, int y) {
	int res = 1;
	for ( ; y; y >>= 1, x = 1ll * x * x % mod)
		if (y & 1) res = 1ll * res * x % mod;
	return res;
}

int tot, rt[_];
int lc[_ * 200], rc[_ * 200], prod[_ * 200];

void clone (int & x, int p, int v) {
	x = ++ tot;
	lc[x] = lc[p], rc[x] = rc[p], prod[x] = 1ll * prod[p] * v % mod;
}
void modify (int & x, int prv, int l, int r, int p, int v) {
	clone(x, prv, v);
	if (l == r) return ;
	int mid = (l + r) >> 1;
	if (p <= mid) modify(lc[x], lc[prv], l, mid, p, v);
	else modify(rc[x], rc[prv], mid + 1, r, p, v);
}
int query (int x, int l, int r, int ql, int qr) {
	if (! x) return 1;
	if (ql <= l && r <= qr) return prod[x];
	int mid = (l + r) >> 1, res = 1;
	if (ql <= mid) res = 1ll * res * query(lc[x], l, mid, ql, qr) % mod;
	if (qr > mid) res = 1ll * res * query(rc[x], mid + 1, r, ql, qr) % mod;
	return res;
}
int main () {
	rep(i, 2, M) {
		inv[i] = power(i, mod - 2);
		if (! pr[i]) {
			for (int x = i; x <= M; x += i) pr[x] = i;
		}
	}
	prod[0] = 1, inv[1] = 1;
	cin >> n;
	rep(i, 1, n) scanf("%d", & a[i]);
	rep(i, 1, n) {
		int x = a[i];
		modify(rt[i], rt[i - 1], 1, n, i, x);
		while (pr[x]) {
			int k = pr[x], t = 1;
			while (x % k == 0) {
				x /= k, t *= k;
				if (ocr[t]) {
					int root = rt[i];
					modify(rt[i], root, 1, n, ocr[t], inv[k]);	
				}
				ocr[t] = i;
			} 
		}
	}
	cin >> q;
	int lst = 0;
	rep(i, 1, q) {
		int l, r;
		scanf("%d%d", & l, & r);
		l = (l + lst) % n + 1, r = (r + lst) % n + 1;
		if (l > r) swap(l, r);
		printf("%d\n", lst = query(rt[r], 1, n, l, r));
	}
	return 0;
}

标签:rt,int,Boring,rep,Queries,CF1422F,res,ocr,mod
From: https://www.cnblogs.com/Custlo/p/17663284.html

相关文章

  • CF1763F Edge Queries
    CF1763FEdgeQueries圆方树板子题,这题真的有3000吗。首先想到的是缩边双,但是以下情况边双不好处理:点\(2,3,4\)在一个边双里,缩点之后该边双在\(1\)到\(6\)的路径上,但是显然\((2,3),(3,4),(2,4)\)这三条边并不属于\(1\)到\(6\)的路径。考虑建立圆方树,定义方点的权......
  • CodeForces 825G Tree Queries
    洛谷传送门CF传送门模拟赛赛时做法。看到查询路径点权最小值,想到建重构树,满足重构树上\(\operatorname{LCA}(x,y)\)为原树上\(x\toy\)路径的点权最小值。建树方法可以参考CF1797FLiHuaandPath。于是问题变成了,维护一个点集,支持加点,查询给定点\(x\)到点集中所有......
  • 「题解」Codeforces 825G Tree Queries
    点权转边权,把边权设为两个端点的\(\min\),然后发现询问\(x\)的答案,就是询问\(x\)与所有黑点的虚树,边权的\(\min\)是多少。假设要判定答案是否\(\geqk\),那么就是询问\(x\)只经过\(\geqk\)是否能到达所有黑点,于是想到建立Kruskal重构树,那么\(x\)与所有黑点的LCA......
  • CF1762D GCD Queries 题解
    题面给定一个长度为\(n\)的排列\(0,1,\cdots,n-1\)。可以进行最多\(2n\)次询问,每次询问给出两个下标\(i,j\),交互器会返回\(\gcd(p_i,p_j)\)。询问以后,需要输出两个下标\(x,y\),满足\(p_x=0\lorp_y=0\)。特别地,\(\gcd(0,x)=x\)。题解观察次数限制,我们......
  • CF1422F Boring Queries
    CF1422FBoringQueries题意询问区间\(lcm\),强制在线。题解首先考虑每个质因子对于答案的贡献。对于一个质因子\(p_i\)来说其对于区间\([l,r]\)的贡献是其最高次幂。首先考虑离线做法,扫描线,线段树维护答案。将当前加入的数\(a_i\)分解成\(p_i^{k_i}\),我们有一个暴......
  • 【BZOJ 3364】Distance Queries 距离咨询 题解
    原题简化题意:有一棵\(n\)个点的树,\(q\)组询问,每次询问回答两点间的距离。令\(dis[i][j]\)表示\(i\)到\(j\)的距离,根节点为\(rt\),则有\(dis[i][j]=dis[rt][i]+dis[rt][j]-2×dis[rt][lca(i,j)]\),按照题意打即可。#include<bits/stdc++.h>usingnamespacestd;#d......
  • CF938G Shortest Path Queries 题解
    目录题目链接题目分析为什么使用生成树建树对于异或贡献的分析code题目链接CF938G洛谷挂了只能交CF题目分析本题有以下几个关键点:为什么使用生成树建树首先根据\(WC2011\)我们发现可以使用\(dfs\)序来保存节点之间的关系但是我们发现本题目中存在加边删边操作不......
  • QSqlDatabasePrivate::removeDatabase: connection ‘myConnection’ is still in use
    1.解决QSqlDatabasePrivate::removeDatabase:connection‘myConnection’isstillinuse,allquerieswillceasetowork的问题该问题主要是因为没有关闭之前的数据库连接,然后又需要创建新的数据库连接导致。解决方案:必须释放该连接的所有查询,即删除所有与该连接有关的quer......
  • 【线段树】 HDOJ 4027 Can you answer these queries?
    想了好久的线段树,用到的思想好巧妙,因为最大是2的63次方,所以开了个6,7次的平方就全变成一了。。。。比较好写的一种方法是直接用不加lazy的线段树更新区间,然后加一个当sum=R-L+1就不更新的剪枝。。。。我的代码是每加一次开根就pushdown,达到7次以后就不更新了。。。#include<iost......
  • DistanceQueriesonaTree
    [ABC294G]DistanceQueriesonaTree首先树剖+线段树肯定可以直接用树剖模板过掉,但是带两个\(\log\)。我们考虑更优秀的做法。拟定\(1\)为根,首先维护前缀\(dis[i]\)为从\(1\simi\)的路径上的所有边权之和(这里记边权为在下面的点的点权)。显然,没有修改时答案是\(dis_a......