BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数

Description

 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯
竭的水题资源。 
  给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的
φ(φ(n)代表1~n 中与n互质的数的个数) 。由于答案可能很大,所以请对答案 mod 10^6 + 
777。 (本题强制在线,所有询问操作的l,r都需要 xor上一次询问的答案 lastans,初始时,
lastans = 0) 

Input

第一行,两个正整数,N,Q,表示序列的长度和询问的个数。

第二行有N 个正整数,第i个表示Ai. 
下面Q行,每行两个正整数,l r,表示询问[l ^ lastans,r ^ lastans]内所有元素乘积的φ 

Output

Q行,对于每个询问输出一个整数。

Sample Input

5 10
3 7 10 10 5
3 4
42 44
241 242
14 9
1201 1201
0 6
245 245
7 7
6 1
1203 1203

Sample Output

40
240
12
1200
2
240
4
4
1200
4

HINT

1 <= N <= 50000

1 <= Q <= 100000
1 <= Ai <= 10^6

我们处理出前缀积,问题就转化为求区间所有的p-1/p乘起来。
于是我们对ai含有的质因子p,在i对应的位置乘上p-1/p,在pre[p]的位置乘上p/p-1.
然后查询时找到r处的线段树,查询l到r的区间乘积即可。
 
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int mod=1000777;
#define N 50050
#define M 1005050
int inv[M],n,m,a[N];
int prime[M],cnt,vis[M],s[N],root[N],tot,mul[N*100],lst[M],ls[N*100],rs[N*100],ans,mx;
void init() {
int i,j;
for(i=2;i<=mx;i++) {
if(!vis[i]) prime[++cnt]=i;
for(j=1;j<=cnt&&i*prime[j]<=mx;j++) {
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
inv[1]=1;
for(i=2;i<mod;i++) inv[i]=ll(mod-(mod/i))*inv[mod%i]%mod;
}
void insert(int l,int r,int v,int c,int &y,int x) {
y=++tot;
mul[y]=ll(mul[x])*c%mod;
if(l==r) return ;
int mid=(l+r)>>1;
if(v<=mid) rs[y]=rs[x],insert(l,mid,v,c,ls[y],ls[x]);
else ls[y]=ls[x],insert(mid+1,r,v,c,rs[y],rs[x]);
}
int query(int l,int r,int x,int y,int p) {
if(x<=l&&y>=r) return mul[p];
int mid=(l+r)>>1,re=1;
if(x<=mid) re=ll(re)*query(l,mid,x,y,ls[p])%mod;
if(y>mid) re=ll(re)*query(mid+1,r,x,y,rs[p])%mod;
return re;
}
int main() {
scanf("%d%d",&n,&m);
int i,j,x,y;
mul[0]=1;
for(i=1;i<=n;i++) scanf("%d",&a[i]),mx=max(mx,a[i]);
init();
for(s[0]=1,i=1;i<=n;i++) {
// scanf("%d",&a[i]);
// printf("%d:\n",a[i]);
int tmp=a[i]; root[i]=root[i-1];
if(a[i]==1) {
s[i]=s[i-1]; continue;
}
for(j=1;j<=cnt&&prime[j]*prime[j]<=tmp;j++) {
if(tmp%prime[j]==0) {
// printf(" %d ",prime[j]);
if(lst[prime[j]]) insert(1,n,lst[prime[j]],ll(prime[j])*inv[prime[j]-1]%mod,root[i],root[i]);
insert(1,n,i,ll(prime[j]-1)*inv[prime[j]]%mod,root[i],root[i]);
lst[prime[j]]=i;
while(tmp%prime[j]==0) tmp/=prime[j];
}
}
if(tmp!=1) {
if(lst[tmp]) insert(1,n,lst[tmp],ll(tmp)*inv[tmp-1]%mod,root[i],root[i]);
insert(1,n,i,ll(tmp-1)*inv[tmp]%mod,root[i],root[i]);
lst[tmp]=i;
}
// puts("");
s[i]=ll(s[i-1])*a[i]%mod;
}
// ans=40;
while(m--) {
scanf("%d%d",&x,&y);
x^=ans; y^=ans;
if(x>y) swap(x,y);
printf("%d\n",ans=ll(s[y])*inv[s[x-1]]%mod*query(1,n,x,y,root[y])%mod);
}
}
/*
5 10
3 7 10 10 5
3 4
42 44
241 242
14 9
1201 1201
0 6
245 245
7 7
6 1
1203 1203
*/

BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数的更多相关文章

  1. bzoj 4026 dC Loves Number Theory 主席树+欧拉函数

    题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n)代 ...

  2. BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 755  Solved: 432[Submit][Status][Discuss] ...

  3. [bzoj3813] 奇数国 [线段树+欧拉函数]

    题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...

  4. 【bzoj3813】: 奇数国 数论-线段树-欧拉函数

    [bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...

  5. 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}\) 由欧拉函数是积性函数得: \[ ...

  6. 线段树+欧拉函数——cf1114F

    调了半天,写线段树老是写炸 /* 两个操作 1.区间乘法 2.区间乘积询问欧拉函数 欧拉函数计算公式 phi(mul(ai))=mul(ai) * (p1-1)/p1 * (p2-1)/p2 * .. ...

  7. 【BZOJ 3772】精神污染 主席树+欧拉序

    这道题的内存…………………真·精神污染……….. 这道题的思路很明了,我们就是要找每一个路径包含了多少其他路径那么就是找,有多少路径的左右端点都在这条路径上,对于每一条路径,我们随便选定一个端点作为第 ...

  8. BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学

    Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...

  9. Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)

    这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...

随机推荐

  1. Headroom.js插件用法

    一.Headroom.js是什么? Headroom.js是一个轻量级.高性能的JS小工具(不依赖不论什么工具库.),它能在页面滚动时做出响应. 此页面顶部的导航条就是一个鲜活的案例,当页面向下滚动时 ...

  2. 判断用户Input输入的事件来进行登陆

    我们是通过键盘按的object.keyCode获取的 Html <input onkeydown="keydownMsg(event)" type="text&qu ...

  3. 上传图片/文件到server

    package yao.camera.util; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; impo ...

  4. SASS入门之SASS安装

    当然...凭借我这样的肤浅的智商,根本不能理解什么叫certificate verfiy fail... 所以找了一段时间的方法,最后最终在一个sass群里找到了... 发在这里纯属作为自己的一个学习 ...

  5. DataGridView.DataSource= list(Of T)

    注:本文样例的代码承接上篇文章:DataTable填充实体类返回泛型集合. 在D层查询完毕之后.我们将DataTable转化为泛型集合.然后经过中间各层,返回U层.到了这里,问题来了.我们这时候要将这 ...

  6. 关于finfo_file函数获取文件mime值验证出错的问题

    今天在做图片上传 验证图片mime值时 突然发现  个别特殊情况下finfo_file 获取的MIME值不能直接使用, 依照官方的写法是 $finfo=finfo_open(FILEINFO_MIME ...

  7. UUID随机字符串

    public static void main(String[] args){ System.out.println(UUID.randomUUID().toString()); } //输出:698 ...

  8. ok6410[001] Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解

    开发PC:Ubuntu16.04.1 开发板:OK6410[飞凌公司出品] 目标:通过GPIO点亮LED ----------------------------------------------- ...

  9. POJ 3469(Dual Core CPU-最小割)[Template:网络流dinic V2]

    Language: Default Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 19321 ...

  10. Struts MVC工作原理(转载)

    1.Struts MVC中Model 1 和Model 2简介 我们在开发Web应用时经常提到的一个概念是Model 1/Model 2,那么到底它是什么意思呢?其实它是对采用JSP技术构成Web应用 ...