Codeforces1114F Please, another Queries on Array?
题目链接:http://codeforces.com/problemset/problem/1114/F
题意:序列$a$,有两种操作,1 区间里的数同时乘上$x$ 2 求区间的积的欧拉函数
线段树好题。
思路:最直观的思路是,线段树每个节点维护的是一个数组,表示这个数每个素因子及出现的次数,欧拉函数值用矩阵快速幂求解即可。但是这样空间不大够,而且复杂度多个常数,因此不大行。
发现300以内的素数刚好有62个,那么可以用一个long long的二进制数来表示这个数有那些素因子出现,在维护一下区间积,欧拉函数值可以用公式
$\varphi \left( n\right) =n\cdot \dfrac {\prod \left( p_{i}-1\right) }{\prod p_{i}}$
lazy_tag有两个,一个是异或,一个是乘积。我刚开始没用异或,准备直接用乘积来得到异或值,但是因为会取模,所以乘积标记不能用来得到位上的值。
#include <bits/stdc++.h>
#define lp p << 1
#define rp p << 1 | 1
#define ll long long
using namespace std; template<typename T>
inline void read(T &x) {
x = ; T f = ; char ch = getchar();
while (ch < '' || ch > '') { if (ch == '-') f = -; ch = getchar(); }
while (ch >= '' && ch <= '') { x = x * + ch - ; ch = getchar() ;}
x *= f;
} const ll MOD = 1e9 + ;
const int N = 4e5 + ;
int prime[], prin, a[N], n;
ll inv[];
bool vis[]; ll qp(ll a, ll b) {
ll res = ;
while (b) {
if (b & ) res = res * a % MOD;
a = a * a % MOD;
b >>= ;
}
return res;
} inline ll getbin(ll x) {
ll res = ;
for (int i = ; i < prin; i++)
if (x % prime[i] == ) res |= (1LL << i);
return res;
} struct SEG {
ll appear[N << ], num[N << ], lazy[N << ], lazy_bin[N << ];
void pushup(int p) {
appear[p] |= (appear[lp] | appear[rp]);
num[p] = num[lp] * num[rp] % MOD;
}
void pushdown(int p, int llen, int rlen) {
lazy[lp] = lazy[lp] * lazy[p] % MOD;
lazy[rp] = lazy[rp] * lazy[p] % MOD;
lazy_bin[lp] |= lazy_bin[p]; lazy_bin[rp] |= lazy_bin[p];
appear[lp] |= lazy_bin[lp];
appear[rp] |= lazy_bin[rp];
num[lp] = num[lp] * qp(lazy[p], llen) % MOD;
num[rp] = num[rp] * qp(lazy[p], rlen) % MOD;
lazy[p] = ;
lazy_bin[p] = ;
}
void build(int p, int l, int r) {
appear[p] = num[p] = lazy_bin[p] = ;
lazy[p] = ;
if (l == r) {
num[p] = a[l];
appear[p] = getbin(a[l]);
return;
}
int mid = l + r >> ;
build(lp, l, mid);
build(rp, mid + , r);
pushup(p);
}
void update(int p, int l, int r, int x, int y, ll v, ll bin) {
if (x <= l && r <= y) {
lazy_bin[p] |= bin;
appear[p] |= bin;
lazy[p] = lazy[p] * v % MOD;
num[p] = num[p] * qp(v, r - l + ) % MOD;
return;
}
int mid = l + r >> ;
pushdown(p, mid - l + , r - mid);
if (x <= mid) update(lp, l, mid, x, y, v, bin);
if (y > mid) update(rp, mid + , r, x, y, v, bin);
pushup(p);
}
void query(int p, int l, int r, int x, int y, ll &v, ll &bin) {
if (x <= l && r <= y) {
v = v * num[p] % MOD;
bin |= appear[p];
return;
}
int mid = l + r >> ;
pushdown(p, mid - l + , r - mid);
if (x <= mid) query(lp, l, mid, x, y, v, bin);
if (y > mid) query(rp, mid + , r, x, y, v, bin);
}
} seg; char s[]; int main() {
//freopen("in.txt", "r", stdin);
for (int i = ; i < ; i++) {
if (!vis[i]) prime[prin++] = i;
for (int j = ; j < prin && i * prime[j] < ; j++) {
vis[i * prime[j]] = ;
if (i % prime[j] == ) break;
}
}
inv[] = ;
for (int i = ; i < ; i++) inv[i] = (MOD - MOD / i) * inv[MOD % i] % MOD;
read(n);
int q; read(q);
for (int i = ; i <= n; i++) read(a[i]);
seg.build(, , n);
while (q--) {
scanf("%s", s);
if (s[] == 'T') {
int l, r;
read(l); read(r);
ll v = , bin = ;
seg.query(, , n, l, r, v, bin);
for (int i = ; i < prin; i++) {
if (bin >> i & ) v = v * (prime[i] - ) % MOD * inv[prime[i]] % MOD;
}
printf("%lld\n", v);
} else {
int l, r, w;
read(l); read(r); read(w);
seg.update(, , n, l, r, w, getbin(w));
}
}
return ;
}
Codeforces1114F Please, another Queries on Array?的更多相关文章
- Codeforces 1114F Please, another Queries on Array? 线段树
Please, another Queries on Array? 利用欧拉函数的计算方法, 用线段树搞一搞就好啦. #include<bits/stdc++.h> #define LL ...
- CF1114F Please, another Queries on Array?
CF1114F Please, another Queries on Array? 考虑用线段树维护取模后的区间积和真正的区间积所含有的质因子. 每次询问查得这两个值后,一乘一除,即可算出该区间积的欧 ...
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)
比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子. ...
- [Codeforces266E]More Queries to Array...——线段树
题目链接: Codeforces266E 题目大意:给出一个序列$a$,要求完成$Q$次操作,操作分为两种:1.$l,r,x$,将$[l,r]$的数都变为$x$.2.$l,r,k$,求$\sum\li ...
- Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]
Codeforces 洛谷:咕咕咕 CF少有的大数据结构题. 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)= ...
- 【Codeforces 1114F】Please, another Queries on Array?
Codeforces 1114 F 题意:给你一个序列\(a_{1\dots n}\),以及\(q\)次查询,每次查询有两种格式: TOTIENT \(l\) \(r\):求出\(\phi(\Pi_{ ...
- CF1114F Please, another Queries on Array?(线段树,数论,欧拉函数,状态压缩)
这题我在考场上也是想出了正解的……但是没调出来. 题目链接:CF原网 题目大意:给一个长度为 $n$ 的序列 $a$,$q$ 个操作:区间乘 $x$,求区间乘积的欧拉函数模 $10^9+7$ 的值. ...
- Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)
这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...
随机推荐
- 我瞅瞅源码系列之---flask
快速使用 通过werkzurg 了解wsgi threading.local和高级 LocalStack和Local对象实现栈的管理 Flask源码之:配置加载 Flask源码之:路由加载 ...
- 二叉树根结点到任意结点的路径(C语言)
有一棵二叉树,如下图所示: 其中 # 表示空结点. 先序遍历:A B D E G C F 问题:怎么得到从根结点到任意结点的路径呢? 示例:输入 G,怎么得到从结点 A 到结点 G 的路径呢? 很明显 ...
- 手把手教你做JavaWeb项目:登录模块
现如今,无论是客户端还是移动端,无论是游戏登陆还是社交平台登陆,无处不在的“登陆”.那么你知道怎么制作吗?今天就为你娓娓道来: 用户登录 在各大信息管理系统中,登录功能是必不可少的,他的作用就是验证用 ...
- Java Web报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
问题描述: 我们在用Eclipse进行Java web开发时,可能会出现这样的错误:The superclass javax.servlet.http.HttpServlet was not foun ...
- GridControl单元格编辑验证的方法
本文实例演示了DevExpress实现GridControl单元格编辑验证的方法,比较实用的功能,具体方法如下: 主要功能代码如下: /// <summary> /// 自定义单元格验证 ...
- IDEA 2019 快捷键终极大全
常用的有fori/sout/psvm+Tab即可生成循环.System.out.main方法等boilerplate样板代码 . 例如要输入for(User user : users) 只需输入use ...
- 论文笔记: Matrix Factorization Techniques For Recommender Systems
Recommender system strategies 通过例子简单介绍了一下 collaborative filtering 以及latent model,这两个方法在之前的博客里面介绍过,不累 ...
- java之spring mvc之页面跳转
1. 如果返回值为ModelAndView,在处理方法中,返回null时,默认跳转的视图名称为请求名.跳转结果会根据视图解析器来跳转. @RequestMapping("/hello.do& ...
- C# 多线程与高并发处理并且具备暂停、继续、停止功能
--近期有一个需要运用多线程的项目,会有并发概率,所以写了一份代码,可能有写地方还不完善,后续有需求在改 1 /// <summary> /// 并发对象 /// </summary ...
- MVC的Views中使用递归生成Html【转】
在开发过程中往往会有一个需求,就是将一个树状的数据结构在视图中表示出来.例如最传统的多级分类,系统中有一系列根分类,每个分类中又带有一些子分类,而我们的目标便是在页面上生成一个由ul和li嵌套组成的H ...