线段树+欧拉函数——cf1114F
调了半天,写线段树老是写炸
/*
两个操作
1.区间乘法
2.区间乘积询问欧拉函数 欧拉函数计算公式
phi(mul(ai))=mul(ai) * (p1-1)/p1 * (p2-1)/p2 * .. * (pk-1)/pk
因为只有300以内的质数(62个)用一个long long来状态压缩
因此线段树结点维护住区间的质数状态集合S,区间的乘积 操作1 [l,r] x:把x质因数分解,然后更新S,然后再更新乘积,
操作2 [l,r]:询问到区间的状态集合S,区间的乘积,再求逆元进行除法 先把62个质数的逆元求出来 线段树结点维护区间乘积,区间质数集合S,然后两个lazy标记
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define maxn 400005
ll n,q;
ll p[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,};
ll invp[];
ll Pow(ll a,ll b){
ll res=;
while(b){
if(b%)res=res*a%mod;
b>>=;a=a*a%mod;
}
return res;
} ll a[maxn]; #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
//mul是区间乘积,l_mul是区间乘的lazy
ll msk[maxn<<],mul[maxn<<],l_msk[maxn<<],l_m[maxn<<];
inline ll calc(ll x){
ll res=;
for(ll i=;i<;i++)
if(x%p[i]==) res|=((ll)<<i);
return res;
}
void pushup(int rt){
mul[rt]=mul[rt<<] * mul[rt<<|] % mod;
msk[rt]=msk[rt<<] | msk[rt<<|];
}
void pushdown(int l,int r,int rt){
if(l_msk[rt]!=){
l_msk[rt<<] |= l_msk[rt]; msk[rt<<] |= l_msk[rt];
l_msk[rt<<|] |= l_msk[rt]; msk[rt<<|] |= l_msk[rt];
l_msk[rt]=;
}
if(l_m[rt]!=){//整个区间都要乘
int m=l+r>>;
l_m[rt<<]=l_m[rt<<] * l_m[rt]%mod;
mul[rt<<]=Pow(l_m[rt],m-l+) * mul[rt<<]%mod;
l_m[rt<<|]=l_m[rt<<|] * l_m[rt]%mod;
mul[rt<<|]=Pow(l_m[rt],r-m) * mul[rt<<|]%mod;
l_m[rt]=;
}
}
void build(int l,int r,int rt){
l_msk[rt]=;l_m[rt]=;
if(l==r){
mul[rt]=a[l];
msk[rt]=calc(a[l]);
return ;
}
int m=l+r>>;
build(lson);build(rson);
pushup(rt);
}
void up_mul(int L,int R,ll x,int l,int r,int rt){
if(L<=l && R>=r){
l_m[rt]=l_m[rt]*x%mod;
mul[rt]=mul[rt]*Pow(x,r-l+)%mod;
return;
}
pushdown(l,r,rt);
int m=l+r>>;
if(L<=m)up_mul(L,R,x,lson);
if(R>m)up_mul(L,R,x,rson);
pushup(rt);
}
void up_S(int L,int R,ll S,int l,int r,int rt){
if(L<=l && R>=r){
l_msk[rt]|=S;
msk[rt]|=S;
return;
}
pushdown(l,r,rt);
int m=l+r>>;
if(L<=m) up_S(L,R,S,lson);
if(R>m) up_S(L,R,S,rson);
pushup(rt);
}
ll q_mul(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return mul[rt];
pushdown(l,r,rt);
int m=l+r>>;
ll res=;
if(L<=m)
res=res*q_mul(L,R,lson)%mod;
if(R>m)
res=res*q_mul(L,R,rson)%mod;
return res;
}
ll q_S(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return msk[rt];
pushdown(l,r,rt);
int m=l+r>>;
ll S=;
if(L<=m)
S|=q_S(L,R,lson);
if(R>m)
S|=q_S(L,R,rson);
return S;
}
int main(){
for(int i=;i<;i++)
invp[i]=Pow(p[i],mod-);
cin>>n>>q;
for(int i=;i<=n;i++)scanf("%lld",&a[i]); build(,n,); char op[];ll l,r,x;
while(q--){
scanf("%s",op);
if(op[]=='M'){
scanf("%lld%lld%lld",&l,&r,&x);
up_mul(l,r,x,,n,);
ll S=calc(x);
up_S(l,r,S,,n,);
}
else {
scanf("%lld%lld",&l,&r);
ll S=q_S(l,r,,n,);
ll mul=q_mul(l,r,,n,);
for(ll i=;i<;i++)
if(S & ((ll)<<i))
mul=(mul*invp[i]%mod*(p[i]-)%mod);
cout<<mul<<endl;
}
}
return ;
}
线段树+欧拉函数——cf1114F的更多相关文章
- BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 755 Solved: 432[Submit][Status][Discuss] ...
- 【bzoj3813】: 奇数国 数论-线段树-欧拉函数
[bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...
- [bzoj3813] 奇数国 [线段树+欧拉函数]
题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...
- Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)
题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...
- Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)
这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...
- BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)
由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...
- 【BZOJ3813】奇数国 线段树+欧拉函数
[BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...
- BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学
Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...
- BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数
BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...
随机推荐
- 多flavor导致的源码依赖问题-- Cannot choose between the following configurations of project :sample:
一.背景: 当我们在源码依赖的时候经常会导致一些问题. 我们的主工程有如下配置,它依赖了一个sample的本地工程 flavorDimensions "demo" productF ...
- oracle密码过期,改为原来的密码
我们都知道Oracle 数据库的用户的密码默认是有有效期限制的,特别是在Cloud上面的DB,有些用户是Cloud自动创建的,我们不知道原来的密码是什么,但是如果密码过期了,如果修改成新的密码,会影响 ...
- Center OS 7安装 Apollo
声明: 每个人的情况都不一样,所以大家在看教程的时候自行斟酌,最好先扫一遍,再来根据自身情况进行操作.同时,遇到的问题也可能不尽相同,要灵活处理. 了解: Apollo是从原始ActiveMQ的基础构 ...
- requests中text和content的区别
# -*- coding: utf-8 -*- __author__ = "nixinxin" import re img_url = "https://f11.baid ...
- AES加密php,java,.net三种语言同步实现加密、解密
话不多数上代码: java::: /* * To change this license header, choose License Headers in Project Properties. * ...
- Redis探索之路(七):Redis高级使用特性
一:安全性 设置客户端连接后进行任何其他指定前需要使用的密码. 因为Redis的速度非常之快,一台比较好的服务器下,一个外部的用户可以在1s内进行15万次的密码尝试连接,这就意味着你需要指定非常强大的 ...
- __new__构造方法
""" 对象的创建过程:new创建 返回 模拟实例对象的创建过程. 为啥是静态方法? 先有new后来init.因为init是需要实例对象来调用的,需要一个实例对象和sel ...
- ASCII 对应表
{ Bin (二进制) Oct (八进制) Dec (十进制) Hex (十六进制) 缩写/字符 解释 0000 0000 00 0 0x00 NUL(null) 空字符 0000 0001 01 1 ...
- JS分支结构与循环结构
1.分支结构 ①if语句 语法结构 if (/* 条件表达式 */) { // 执行语句 } if (/* 条件表达式 */){ // 成立执行语句 } else { // 否则执行语句 } ...
- 50 ubuntu下pcl编译以及用 VSCode配置pcl / opencv开发环境
0 引言 最近在VSCode下搞开发,于是将pcl库迁移到这个环境下,用来跑一些依赖pcl的开源的代码以及自己做一些快速开发等. 1 pcl编译 主要参考了这篇博客,链接如下. https://blo ...