[codeforces]Round #538 (Div. 2) F. Please, another Queries on Array?

news/2024/12/22 1:24:54/

题解: 

     $$  ans=F\left ( \prod _{i=l}^{r}a_i \right ) $$

   $$ =(p_i-1){p_i}^{k_i-1}*.....*(p_j-1){p_j}^{k_j-1} $$

   $$={p_i}^{k_i}*.....*{p_j}^{k_j}*(\frac{p_i-1}{p_i}*......*\frac{p_j-1}{p_j})  $$

   因为数据范围保证$ a_i\leq 300 $ 所以在这个范围内只有62个素因子  我们可以直接每一位对应一bit  来判断区间中某个素因子是否出现 然后查询就行了

(常数写的有点大....懒得优化了  

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define link(x) for(edge *j=h[x];j;j=j->next)
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
const int MAXN=4e5+10;
const double eps=1e-8;
#define ll long long
const int mod=1e9+7;
using namespace std;
struct edge{int t,v;edge*next;}e[MAXN<<1],*h[MAXN],*o=e;
void add(int x,int y,int vul){o->t=y;o->v=vul;o->next=h[x];h[x]=o++;}
ll read(){ll x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f;
}ll ksm(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod;b=b>>1;}return ans;
}ll key[MAXN<<2],tag[MAXN<<2],sum[MAXN<<2],flag[MAXN<<2];
int a[MAXN];
int vis[305],p[MAXN];void push(int rt,int l,int r){if(tag[rt]!=1){int mid=(l+r)>>1;tag[rt<<1]*=tag[rt];tag[rt<<1]%=mod;tag[rt<<1|1]*=tag[rt];tag[rt<<1|1]%=mod;sum[rt<<1]*=ksm(tag[rt],mid-l+1);sum[rt<<1]%=mod;sum[rt<<1|1]*=ksm(tag[rt],r-mid);sum[rt<<1|1]%=mod;tag[rt]=1;}if(flag[rt]){key[rt<<1]|=flag[rt];key[rt<<1|1]|=flag[rt];flag[rt<<1]|=flag[rt];flag[rt<<1|1]|=flag[rt];flag[rt]=0;}
}void up(int x){key[x]=(key[x<<1]|key[x<<1|1]);sum[x]=(sum[x<<1]*sum[x<<1|1])%mod;
}void built(int rt,int l,int r){tag[rt]=1;if(l==r){sum[rt]=1;for(int i=2;i*i<=a[l];i++){if(a[l]%i==0){int num=0;while(a[l]%i==0)num++,a[l]/=i;sum[rt]=sum[rt]*ksm(i,num)%mod;key[rt]|=(1LL<<vis[i]);}}if(a[l]!=1){sum[rt]=(sum[rt]*a[l])%mod;key[rt]|=(1LL<<vis[a[l]]);}return ;}int mid=(l+r)>>1;built(rt<<1,l,mid);built(rt<<1|1,mid+1,r);up(rt);
}ll v1,v2;void update(int rt,int l,int r,int ql,int qr){if(ql<=l&&r<=qr){tag[rt]*=v1;tag[rt]%=mod;flag[rt]|=v2;sum[rt]*=ksm(v1,r-l+1);key[rt]|=v2;return ;}int mid=(l+r)>>1;push(rt,l,r);if(ql<=mid)update(rt<<1,l,mid,ql,qr);if(qr>mid)update(rt<<1|1,mid+1,r,ql,qr);up(rt);
}ll ans1,ans2;
void query(int rt,int l,int r,int ql,int qr){if(ql<=l&&r<=qr){ans1*=sum[rt];ans1%=mod;ans2|=key[rt];return ;}int mid=(l+r)>>1;push(rt,l,r);if(ql<=mid)query(rt<<1,l,mid,ql,qr);if(qr>mid)query(rt<<1|1,mid+1,r,ql,qr);up(rt);
}int main(){int cnt=0;inc(i,2,300){bool flag=0;for(int j=2;j*j<=i;j++){if(i%j==0){flag=1;break;}}if(!flag)vis[i]=cnt++,p[cnt-1]=i;}int n=read();int m=read();inc(i,1,n)a[i]=read();built(1,1,n);char str[11];int l,r,x;while(m--){scanf("%s",str);l=read();r=read();if(str[0]=='T'){ans1=1;ans2=0;query(1,1,n,l,r);for(int i=61;i>=0;i--){if((ans2>>i)&1)ans1*=((p[i]-1)*ksm(p[i],mod-2)%mod),ans1%=mod;}printf("%lld\n",ans1);}else{x=read();v1=1;v2=0;for(int i=2;i*i<=x;i++){if(x%i==0){int num=0;while(x%i==0)num++,x/=i;v1=v1*ksm(i,num)%mod;v2|=(1LL<<vis[i]);}}if(x!=1){v1=(v1*x)%mod;v2|=(1LL<<vis[x]);}update(1,1,n,l,r);}}return 0;
}

  

转载于:https://www.cnblogs.com/wang9897/p/10360754.html


http://www.ppmy.cn/news/611882.html

相关文章

OpenCV+python:分水岭算法

1&#xff0c;概念简介 现实中我们可以或者说可以想象有山有湖的景象&#xff0c;那么那一定是水绕 山&#xff0c;山围水的情形。当然在需要的时候&#xff0c;要人工构筑分水岭&#xff0c;以防集水盆之间的互相穿透。而区分高山&#xff08;plateaus&#xff09;与水的界线&…

【Python】match 语句

该特性已经有 final 版本 since Python 3.10&#xff0c;出自 PEP 636&#xff0c;因此本文就该版本完整介绍 match 语句的各种花里胡哨的用法。 match 语句&#xff0c;或者说是 match-case 语句更为适合&#xff0c;和其他语言的 switch-case 语句类似&#xff0c;用作多条件…

background 与 background-image

background background 简写属性在一个声明中设置所有的背景属性。 可以设置如下属性&#xff1a; background-colorbackground-positionbackground-sizebackground-repeatbackground-originbackground-clipbackground-attachmentbackground-image 如果不设置其中的某个值&a…

快手推荐系统及 Redis 升级存储

快手推荐系统及 Redis 升级存储 借傲腾™ 补上 DRAM 短板 内容简介&#xff1a; 作为短视频领域的领先企业&#xff0c;快手需要不断导入更先进的技术手段来调整和优化其系统架构&#xff0c;以应对用户量和短视频作品数量的爆炸式增长&#xff1b; 这其中&#xff0c;作…

tar 和gzip 的区别

首先要 弄清两个概念&#xff1a;打包和压缩。 打包是指将一大堆文件或目录什么的变成一个总的文件&#xff0c; 压缩则是将一个大的文件通过一些压缩算法变成一个小文件。 为什么要区分这两个概念呢&#xff1f;其实这源于Linux中的很多压缩程序只能针对一个文件进行压缩&…

OpenCV+python:人脸检测

1&#xff0c;人脸检测简介 人脸检测的模型主要有两类&#xff0c;一类是知识模型&#xff0c;根据眼睛、嘴、鼻子的相对位置或面部不同部位的颜色深度差异来检测人脸&#xff0c;另一类是统计模型&#xff0c;把海量的人脸数据转换成二维像素矩阵&#xff0c;从统计的观点出发…

英特尔内存革新助平安云 Redis 云服务降本增效

英特尔内存革新助平安云 Redis 云服务降本增效 英特尔 傲腾™ 数据中心级持久内存的引入&#xff0c;为平安云的降本增效开启了一条新的道路。通过对平安云 Redis 数据库产品的支持&#xff0c;用户能享受到性能优异且价格实惠的云服务&#xff0c;接下来我们还将通过更多类似…

JAVA 包装类

JAVA 包装类 1 包装类 把基本类型进行包装&#xff0c;提供更加完善的功能。 基本类型是没有任何功能的,只是一个变量,记录值,而包装类可以有更加丰富的功能 1.1 与基本类型的对应关系 1.2 Number 数字包装类的抽象父类。 提供了各种获取值的方式。 1.3 Integer 创建对象…