Question

给你一个区间,有修改和查询操作:
修改:将一段区间乘以x
查询:∏i=lrφ(a[i])mod108+7∏_{i=l}^rφ(a[i]) mod 10^8+7∏i=lr​φ(a[i])mod108+7
(a[i],x&lt;=600,n&lt;=10000)(a[i],x&lt;=600,n&lt;=10000)(a[i],x<=600,n<=10000)

Solution

我们一看到有欧拉函数,就想到了关于欧拉函数的一些性质:
φ(x)=x∗(1−1/p1)∗(1−1/p2)∗...∗(1−1/pn)φ(x)=x*(1-1/p1)*(1-1/p2)*...*(1-1/pn)φ(x)=x∗(1−1/p1)∗(1−1/p2)∗...∗(1−1/pn)
就是这个性质,我们可以将答案分成两个问来求:
一个是就区间a[i]的乘积,另一个就是包含这个质数的个数。
因为模数是个质数,所以说可以用费马小定理来实现。
这两个都可以用线段树+懒惰标记来实现,而且600以内的质数就只有109个,所以时间复杂度可以保证(109∗nlogn)(109*n log n)(109∗nlogn)

Code

#include<cstdio>
#include<cstring>
#define N 10010
#define ll long long
#define mo 100000007
using namespace std;
int prime[610],di[5],cnt=0;
ll t[N*4+10][110],lazy[N*4+10][110];
ll num[N<<3],lz[N<<3],ycl[110];
int n,a[N],q,opt,l,r,X;
bool bz[610],hav[N<<3];
ll ans=0;inline int read()
{int x=0; char c=getchar();while (c<'0' || c>'9') c=getchar();while (c>='0' && c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x;
}ll ksm(ll x,int y)
{ll s=1;while (y){if (y & 1) s=s*x%mo;x=x*x%mo,y>>=1;}return  s;
}void find(int x)
{cnt=0;for (int i=1;i<=109;i++)if (x%prime[i]==0) di[++cnt]=i;
}void update(int x,int l,int r)
{int mid=l+r>>1;for (int i=1;i<=109;i++)if (t[x][i]==r-l+1)t[x<<1][i]=mid-l+1,t[x<<1|1][i]=r-mid;hav[x<<1]=hav[x<<1|1]=1;hav[x]=0;
}void change(int x)
{num[x]=num[x<<1]*num[x<<1|1]%mo;for (int i=1;i<=cnt;i++)t[x][di[i]]=t[x<<1][di[i]]+t[x<<1|1][di[i]];
}void build(int x,int l,int r,int f)
{if (l==r){num[x]=a[f];for (int i=1;i<=cnt;i++)t[x][di[i]]=1;return;}int mid=l+r>>1;if (f<=mid) build(x<<1,l,mid,f);else build(x<<1|1,mid+1,r,f);change(x);
}void plus(int x,int l,int r,int fl,int fr)
{if (fl<=l && fr>=r){lz[x]=lz[x]*X%mo;num[x]=num[x]*ksm(X,r-l+1)%mo;for(int i=1;i<=cnt;i++)t[x][di[i]]=r-l+1;hav[x]=1;return;}int mid=l+r>>1;if (lz[x]>1){num[x<<1]=num[x<<1]*ksm(lz[x],mid-l+1)%mo;num[x<<1|1]=num[x<<1|1]*ksm(lz[x],r-mid)%mo;lz[x<<1]=lz[x<<1]*lz[x]%mo;lz[x<<1|1]=lz[x<<1|1]*lz[x]%mo; lz[x]=1;}if (hav[x]) update(x,l,r);if (fl<=mid) plus(x<<1,l,mid,fl,fr);if (fr>mid) plus(x<<1|1,mid+1,r,fl,fr);change(x);
}void gans(int x,int l,int r,int fl,int fr)
{if (fl<=l && fr>=r) {ans=ans*num[x]%mo;for (int i=1;i<=109;i++)if (t[x][i]>0) ans=ans*ksm(ycl[i],t[x][i])%mo;return;}int mid=l+r>>1;if (lz[x]>1){num[x<<1]=num[x<<1]*ksm(lz[x],mid-l+1)%mo;num[x<<1|1]=num[x<<1|1]*ksm(lz[x],r-mid)%mo;lz[x<<1]=lz[x<<1]*lz[x]%mo;lz[x<<1|1]=lz[x<<1|1]*lz[x]%mo; lz[x]=1;}if (hav[x]) update(x,l,r);if (fl<=mid) gans(x<<1,l,mid,fl,fr);if (fr>mid) gans(x<<1|1,mid+1,r,fl,fr);
}int main()
{freopen("runway.in","r",stdin);
//  freopen("runway.out","w",stdout);for (int i=2;i<=600;i++)if (!bz[i]){prime[++prime[0]]=i;ycl[prime[0]]=(i-1)*ksm(i,mo-2)%mo;for (int j=1;j<=600/i;j++)bz[i*j]=1;}n=read();for (int i=1;i<=40000;i++) lz[i]=1;for (int i=1;i<=n;i++)a[i]=read(),find(a[i]),build(1,1,n,i);q=read();while (q--){opt=read(),l=read(),r=read();if (opt==0) X=read(),find(X),plus(1,1,n,l,r);else ans=1,gans(1,1,n,l,r),printf("%lld\n",ans);}return 0;
}

jzoj 4638. 第三条跑道相关推荐

  1. jzoj4638-第三条跑道【欧拉函数,线段树】

    正题 题目大意 要求支持区间乘和区间求∏φ(xi)\prod \varphi(x_i)∏φ(xi​) 解题思路 首先φ(n)=n∗∏(pi−1pi)\varphi(n)=n*\prod (\frac{ ...

  2. 智力题:36匹马,6条跑道,没有计时器,至少需要多少次选出最快的三匹马

    智力题:36匹马,6条跑道,没有计时器,至少需要多少次选出最快的三匹马 1.将马分成六组进行比赛,比赛六次,六组马分别都是有序的. 2.分别将六组马中跑得最快的马挑出来,让这六匹马再进行第七次比赛,将 ...

  3. 面试思考题:25匹马5条跑道选前三

    今天第一次面试,腾讯微众银行的web开发岗,除了深刻地认识到自己是个铁five之外,也算是积累了面试经验吧.面试官人还挺好的,看我菜也没有说啥(甚至还安慰我说我还行),面试官最后给我出的那道思考题还是 ...

  4. 如何给前三条最新信息旁边加上一个红旗

    有时为了突出最新信息,可以在最新信息前几条定义为小红旗,但是asp中俺不会写这样的语句,不知有办法吗 我的代码如下:要求在新闻资讯版块中的前三条右边前上小红旗,以表明这三条是最新发的信息. Sub k ...

  5. AI人工智能开发的路径有三条,最成功的是机器学习技术:强化学习

    https://www.toutiao.com/a6683382168732828174/ 2019-04-24 16:56:12 阿尔法围棋(AlphaGo为什么能够成为第一个击败人类职业围棋选手. ...

  6. 简要说明建设城市大脑三条关键标准规范

    作者:刘锋   前言:简要的说,城市大脑不是一个城市级AI信息系统,也不是城市内部的信息化建设,而是互联网结构从网状模型向大脑模型进化时,与城市建设结合的产物,因此建设城市大脑需要拥有三个特征或关键标 ...

  7. 减少企业Web威胁的三条预防性措施

    减少企业Web威胁的三条预防性措施 http://netsecurity.51cto.com  2010-10-20 09:39  佚名  TT安全  我要评论(0) 摘要:在企业中我们更应该关注网络 ...

  8. 企业网站做SEO优化必走的三条路线,希望新人前方不要右转

    企业网站的SEO是有专门的优化人员进行打理的,因为网站优化是一件必要的事情.不过还是有很多职场下白在优化时觉得无从下手,其实企业网站SEO工作时是有一些技巧和规律可循的,所以一定要对SEO工作有一个全 ...

  9. 线下零售企业在数据驱动上的三个挑战和三条思路

    以下内容来自神策数据创始人 & CEO 桑文锋的知乎专栏. 数据分析渗透传统企业是互联网时代大势所趋,也一直是我思考的重点之一,这次我把问题圈定在线下零售企业.我从数据的视角探讨问题,并不是针 ...

  10. C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

    C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加s ...

最新文章

  1. 计算机软件考试预测,2020年计算机软件水平考试信息技术处理员预测试题及参考答案...
  2. LeetCode 503 Next Greater Element II(stack)
  3. MySQL下载以及安装【windows】
  4. 产品经理必备知识之网页设计系列(二)-如何设计出一个优秀的界面
  5. 字符常量在C和C++中的区别
  6. [渝粤教育] 西南科技大学 高等数学1 在线考试复习资料
  7. 「前端」History API与浏览器历史堆栈管理
  8. 计算机网络-信道复用技术
  9. VS封装给Unity使用的DLL
  10. java注解_Java注解
  11. Redis基本命令及相关用法
  12. 数据库索引是什么,它的作用是什么?
  13. win7无法删除文件夹,提示“找不到该项目”
  14. vue 富文本编辑器 Editor 使用
  15. pip 批量完全卸载包
  16. 平衡二叉树的原理及实现
  17. 苹果手机微信聊天记录删除了怎么恢复?(基础操作版)
  18. [IOS][已越狱]配合网易云音乐,使用Bridge快速免iTunes导入音乐到“音乐”
  19. php一点通,编程一点通下载-编程一点通最新安卓版下载-99wo下载站
  20. 单链表的基本操作-插入结点、删除结点、新建链表、查找结点位置

热门文章

  1. 蜂鸟E200(3)乱序、反压、流水线冲突
  2. python 计算斜率
  3. 个人公众号,用于开发经验分享
  4. 解决Visio另存为(或者导出)pdf字符间距变化/不均等字母间距的问题
  5. 戴尔笔记本linux不能开机启动,戴尔笔记本无法开机的解决方法
  6. 网传程序员加班猝死,当事人:我还在写代码
  7. 【Python百日进阶-Web开发-Feffery】Day437 - fac实例:使用fac中上传组件时实现自主控制uploadId
  8. 计算机分区硬盘有写保护,磁盘被写保护怎么解除的教程详解【图解】
  9. 《英语语法新思维初级教程》学习笔记(四)数量限定词和个体限定词
  10. Win10文件名排序