[BZOJ4026]dC Loves Number Theory 欧拉函数+线段树
题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数
题解
考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列
对于每个 \(A_i\) ,枚举它的质因数,由于不同的质因数只算一次,所以我们只关心每个质数它最后一次出现的位置,开一棵线段树维护一下每个位置的质数,加入新的质数时,先把之前的删掉,再加新的
现在强制在线,可以开可持久化线段树维护一下
#include<bits/stdc++.h>
#define REP(i,a,b) for(int i(a);i<=(b);++i)
#define dbg(...) fprintf(stderr,__VA_ARGS__)
const int S=1<<18;
char ibuf[S],*iS,*iT;
#define gc (iS==iT?iT=ibuf+fread(iS=ibuf,1,S,stdin),iS==iT?EOF:*iS++:*iS++)
inline int read(){char c,p=0;int w;
while(isspace(c=gc));if(c=='-')p=1,c=gc;w=c&15;
while(isdigit(c=gc))w=w*10+(c&15);return p?-w:w;
}
template<typename T,typename U>inline bool smin(T&x,const U&y){return x>y?x=y,1:0;}
template<typename T,typename U>inline bool smax(T&x,const U&y){return x<y?x=y,1:0;}
const int N=50005,M=1e6+999,p=1e6+777;
int n,pr[1105],pre[M],inv[M],mul[N];
bool np[1105];
struct node{int ls,rs,w;}t[N*100];
int rt[N],cnt;
inline void ins(int&o,int l,int r,int x,int v){
t[++cnt]=t[o];o=cnt;t[o].w=1ll*t[o].w*v%p;
if(l==r)return;int mid=l+r>>1;
x<=mid?ins(t[o].ls,l,mid,x,v):ins(t[o].rs,mid+1,r,x,v);
}
inline int ask(int o,int l,int r,int x){
if(x<=l)return t[o].w;
if(x>r)return 1;int mid=l+r>>1;
return 1ll*ask(t[o].ls,l,mid,x)*ask(t[o].rs,mid+1,r,x)%p;
}
signed main(){
n=read();int q=read();
REP(i,2,1100){
if(!np[i])pr[++pr[0]]=i;
REP(j,1,pr[0]){
if(1ll*i*pr[j]>1100)break;
np[i*pr[j]]=1;
if(i%pr[j]==0)break;
}
}
inv[0]=inv[1]=mul[0]=t[0].w=1;
REP(i,2,p-1)inv[i]=1ll*(p-p/i)*inv[p%i]%p;
REP(i,1,n){
int x=read();mul[i]=1ll*mul[i-1]*x%p;rt[i]=rt[i-1];
REP(j,1,pr[0]){
if(pr[j]*pr[j]>x)break;
if(x%pr[j])continue;
if(pre[pr[j]])ins(rt[i],1,n,pre[pr[j]],1ll*pr[j]*inv[pr[j]-1]%p);
ins(rt[i],1,n,pre[pr[j]]=i,1ll*(pr[j]-1)*inv[pr[j]]%p);
do x/=pr[j];while(x%pr[j]==0);
}
if(x>1){
if(pre[x])ins(rt[i],1,n,pre[x],1ll*x*inv[x-1]%p);
ins(rt[i],1,n,pre[x]=i,1ll*(x-1)*inv[x]%p);
}
}
int ans=0;
while(q--){
int l=read()^ans,r=read()^ans;
printf("%d\n",ans=1ll*mul[r]*inv[mul[l-1]]%p*ask(rt[r],1,n,l)%p);
}
return 0;
}
[BZOJ4026]dC Loves Number Theory 欧拉函数+线段树的更多相关文章
- [BZOJ4026]dC Loves Number Theory(线段树)
根据欧拉函数的定义式可知,可以先算出a[l]*a[l+1]*...*a[r]的值,然后枚举所有存在的质因子*(p-1)/p. 发现这里区间中一个质因子只要计算一次,所以指计算“上一个同色点在区间外”的 ...
- LightOJ 1370 Bi-shoe and Phi-shoe 欧拉函数+线段树
分析:对于每个数,找到欧拉函数值大于它的,且标号最小的,预处理欧拉函数,然后按值建线段树就可以了 #include <iostream> #include <stdio.h> ...
- loj1370(欧拉函数+线段树)
传送门:Bi-shoe and Phi-shoe 题意:给出多个n(1<=n<=1e6),求满足phi(x)>=n的最小的x之和. 分析:先预处理出1~1e6的欧拉函数,然后建立一颗 ...
- BZOJ4026: dC Loves Number Theory
Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所 ...
- LOJ #2142. 「SHOI2017」相逢是问候(欧拉函数 + 线段树)
题意 给出一个长度为 \(n\) 的序列 \(\{a_i\}\) 以及一个数 \(p\) ,现在有 \(m\) 次操作,每次操作将 \([l, r]\) 区间内的 \(a_i\) 变成 \(c^{a_ ...
- bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)
这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...
- [LNOI] 相逢是问候 || 扩展欧拉函数+线段树
原题为2017六省联考的D1T3 给出一个序列,m次操作,模数p和参数c 操作分为两种: 1.将[l,r]区间内的每个数x变为\(c^x\) 2.求[l,r]区间内数的和%p 首先,我们要了解一些数论 ...
- [bzoj4026]dC Loves Number Theory_主席树_质因数分解_欧拉函数
dC Loves Number Theory 题目大意:dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问 ...
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
随机推荐
- bytes、str与unicode
1.Python3字符序列的类型 bytes -> 原始的8位值(既字节) str -> Unicode字符 2.Python2字符序列的类型 str -> 原始的8位值(既字节) ...
- 2015 Multi-University Training Contest 3 hdu 5326 Work
Work Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Java读书笔记一(异常处理)
1.介绍 在开发过程中.都会遇到程序执行时的异常,比如逻辑错误.硬件故障等,本篇博客将会具体的介绍一下Java中的异常处理机制. 2.Try和Catch捕获异常 我们在处理异常过程中经经常使用到的就是 ...
- Swift环境下实现UILabel居上 居中 居下对齐
首先在Xcode中新建.h文件,将下面代码复制进去 // // myUILabel.h // // // Created by yexiaozi_007 on 3/4/13. // Copyright ...
- java 获取类路劲注意点
在resin里用MyConstants.class.getResource("/").getPath(),这个方法时,获取到的路劲少[项目名称],最好用MyConstants.cl ...
- python批量下载色影无忌和蜂鸟的图片 爬虫小应用
有些冗余信息.由于之前測试正則表達式.所以没有把它们给移走.只是不影响使用. # -*- coding:utf-8 -*- import re,urllib,sys,os,time def getAl ...
- Leetcode:Singel Number
问题描写叙述: Given an array of integers, every element appears twice except for one. Find that single one ...
- iPad iOS8.0升级和Xcode 6.0.1公布了,附Xcode 6.0.1下载地址
今天上午把iPad mini升级到了iOS 8.0,升级提示须要6.7G空间,无奈仅仅好把一些大的App删掉腾冲空间,然后開始升级,3小时后最终升级成功了. 下午试着把我们的App通过xcode 5 ...
- bzoj3158&3275: 千钧一发(最小割)
3158: 千钧一发 题目:传送门 题解: 这是一道很好的题啊...极力推荐 细看题目:要求一个最大价值,那么我们可以转换成求损失的价值最小 那很明显就是最小割的经典题目啊?! 但是这里两个子集的分化 ...
- Mvc前后端显示不同的404错误页
最近做的系统前端是移动端的,后端是PC端,然后404页面不能用通一个,so 查找了一些资料,找到了一个解决办法 在Global.asax文件夹下添加Application_EndRequest事件处 ...