Codeforces 594D REQ 线段树
把询问离线, 我们从n 到 1遍历过去的时候, 把(1 - 1 / p)乘在最靠近当前位置的地方, 然后区间求乘积就好啦。
#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PLL pair<LL, LL>
#define PLI pair<LL, int>
#define PII pair<int, int>
#define SZ(x) ((int)x.size())
#define ull unsigned long long
using namespace std; const int N = 1e6 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; struct SegmentTree {
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
int a[N << ];
void build(int *b, int l, int r, int rt) {
if(l == r) {
a[rt] = b[l];
return;
}
int mid = l + r >> ;
build(b, lson); build(b, rson);
a[rt] = 1ll * a[rt << ] * a[rt << | ] % mod;
}
void update(int p, int val, int l, int r, int rt) {
if(l == r) {
a[rt] = 1ll * a[rt] * val % mod;
return;
}
int mid = l + r >> ;
if(p <= mid) update(p, val, lson);
else update(p, val, rson);
a[rt] = 1ll * a[rt << ] * a[rt << | ] % mod;
}
int query(int L, int R, int l, int r, int rt) {
if(l >= L && r <= R) return a[rt];
int mid = l + r >> ;
if(R <= mid) return query(L, R, lson);
else if(L > mid) return query(L, R, rson);
else return (1ll * query(L, R, lson) * query(L, R, rson)) % mod;
}
}; int n, q, a[N], mul[N], del[N], ans[N], Map[N];
vector<int> prime;
vector<int> fac[N];
vector<PII> qus[N];
SegmentTree seg;
int Power(int a, int b) {
int ans = ;
while(b) {
if(b & ) ans = 1ll * ans * a % mod;
a = 1ll * a * a % mod; b >>= ;
}
return ans;
} int main() {
for(int i = ; i < N; i++) {
if(SZ(fac[i])) continue;
prime.push_back(i);
for(int j = i; j < N; j += i)
fac[j].push_back(i);
}
for(auto& x : prime) {
mul[x] = ( - Power(x, mod - ) + mod) % mod;
del[x] = Power(mul[x], mod - );
}
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
seg.build(a, , n, );
scanf("%d", &q);
for(int i = ; i <= q; i++) {
int L, R; scanf("%d%d", &L, &R);
qus[L].push_back(mk(R, i));
}
for(int i = n; i >= ; i--) {
for(auto& t : fac[a[i]]) {
if(Map[t]) seg.update(Map[t], del[t], , n, );
seg.update(i, mul[t], , n, );
Map[t] = i;
}
for(auto& t : qus[i]) {
ans[t.se] = seg.query(i, t.fi, , n, );
}
}
for(int i = ; i <= q; i++) printf("%d\n", ans[i]);
return ;
} /*
*/
Codeforces 594D REQ 线段树的更多相关文章
- Vasya and a Tree CodeForces - 1076E(线段树+dfs)
I - Vasya and a Tree CodeForces - 1076E 其实参考完别人的思路,写完程序交上去,还是没理解啥意思..昨晚再仔细想了想.终于弄明白了(有可能不对 题意是有一棵树n个 ...
- Codeforces 787D. Legacy 线段树建模+最短路
D. Legacy time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Almost Regular Bracket Sequence CodeForces - 1095E (线段树,单点更新,区间查询维护括号序列)
Almost Regular Bracket Sequence CodeForces - 1095E You are given a bracket sequence ss consisting of ...
- Sereja and Brackets CodeForces - 380C (线段树+分治思路)
Sereja and Brackets 题目链接: CodeForces - 380C Sereja has a bracket sequence s1, s2, ..., *s**n, or, in ...
- CodeForces 91B Queue (线段树,区间最值)
http://codeforces.com/problemset/problem/91/B B. Queue time limit per test: 2 seconds memory limit p ...
- Codeforces 343D WaterTree - 线段树, DFS序
Description Translated by @Nishikino_Maki from Luogu 行吧是我翻的 Mad scientist Mike has constructed a roo ...
- codeforces 787D - Legacy 线段树优化建图,最短路
题意: 有n个点,q个询问, 每次询问有一种操作. 操作1:u→[l,r](即u到l,l+1,l+2,...,r距离均为w)的距离为w: 操作2:[l,r]→u的距离为w 操作3:u到v的距离为w 最 ...
- Subtree Minimum Query CodeForces - 893F (线段树合并+线段树动态开点)
题目链接:https://cn.vjudge.net/problem/CodeForces-893F 题目大意:给你n个点,每一个点有权值,然后这n个点会构成一棵树,边权为1.然后有q次询问,每一次询 ...
- Codeforces 765F Souvenirs 线段树 + 主席树 (看题解)
Souvenirs 我们将询问离线, 我们从左往右加元素, 如果当前的位置为 i ,用一棵线段树保存区间[x, i]的答案, 每次更新完, 遍历R位于 i 的询问更新答案. 我们先考虑最暴力的做法, ...
随机推荐
- json-lib转化java对象,是否转化为null的属性
public static void main(String[] args) throws Exception{ User user = new User(); user.setUid(25); Js ...
- PHP IDE选择标准
2017年11月17日09:35:01 这里记录一下PHP IDE的选择标准 1. 是否有错误提示, 对于一些 `缺少分号`, `花括号不配对`, `变量未定义就使用`等待的提示是要有的 2. 代码 ...
- Bootstrap的插件
04-Bootstrap的插件 1.下拉菜单 代码如下: <div class="dropdown"> <button class="btn btn ...
- 彻底删除mysql服务(清理注册表)
前言 由于安装某个项目的执行文件,提示要卸载MySQL以便它自身MySQL安装,然后我禁用了MYSQL服务,再把这个文件夹删除后,发现还是提示请卸载MYSQL服务. ----------------- ...
- [C]变量作用域
函数环境变量作用域 C语言栈环境变量作用域跟JS是类似的. 就是内部函数可以访问外部函数的执行(栈)环境变量. 当访问一个变量时,程序将会查询当前栈环境是否存在这个变量,如果没有,将会往上层栈环境继续 ...
- 新手-ios
最近突然让我学习一下ios,之前从未接触过(一脸蒙逼).而且我用的电脑也不是ios操作系统.上网查了下 网友说虚拟机也可以,于是本人从此举用上了ios系统. 需要的安装的工具有: 资源共享给大家: h ...
- 自定义redis连接池(字典操作)
pool=redis.ConnectionPool(host='127.0.0.1', port=6379,max_connections=1000)conn=redis.Redis(connecti ...
- 洛谷P3246 [HNOI2016]序列 [莫队]
传送门 思路 看到可离线.无修改.区间询问,相信一定可以想到莫队. 然而,莫队怎么转移是个大问题. 考虑\([l,r]\rightarrow[l,r+1]\)时答案会怎样变化?(左端点变化时同理) \ ...
- linux与window互传文件
首先我们的目标是把一个很大的文件传到linux中,所以我们先要让linux节点开启ftp服务 FTP 10.1.61.212 如果对方没有开启FTP服务,那么这个命令就不会有效果. 1.开启xftp ...
- C#一元二次方程