bzoj4026
直接按照欧拉函数的计算方式来即可
φ=区间积*区间出现(质数-1)的积/区间出现过的质数的积
区间积是满足类似区间减法的操作的(利用逆元)
由于强制在线,上主席树就可以了(维护每个质数上次出现的位置pre,求区间[l,r],pre<l的元素即可)
const mo=;
type node=record
po,next,num:longint;
end;
link=record
l,r:longint;
s1,s2:int64;
end; var ni:array[..mo] of int64;
s,sd:array[..] of int64;
tree:array[..**] of link;
p,v,last:array[..] of longint;
e:array[..] of node;
h,a,q:array[..] of longint;
j,t,n,m,len,i,x,y,ans:longint;
wh:int64; function build(l,r:longint):longint;
var m,q:longint;
begin
inc(t);
tree[t].s1:=;
tree[t].s2:=;
q:=t;
if l<>r then
begin
m:=(l+r) shr ;
tree[q].l:=build(l,m);
tree[q].r:=build(m+,r);
end;
exit(q);
end; function add(l,r,last,x,y:longint):longint;
var m,q:longint;
begin
inc(t);
q:=t;
if l=r then
begin
tree[q].s1:=tree[last].s1*int64(y-) mod mo;
tree[q].s2:=tree[last].s2*ni[y] mod mo;
end
else begin
m:=(l+r) shr ;
if x<=m then
begin
tree[q].r:=tree[last].r;
tree[q].l:=add(l,m,tree[last].l,x,y);
end
else begin
tree[q].l:=tree[last].l;
tree[q].r:=add(m+,r,tree[last].r,x,y);
end;
tree[q].s1:=tree[tree[q].l].s1*tree[tree[q].r].s1 mod mo;
tree[q].s2:=tree[tree[q].l].s2*tree[tree[q].r].s2 mod mo;
end;
exit(q);
end; function get(a,b:link):int64;
var p1,p2:int64;
begin
p1:=b.s1*ni[a.s1] mod mo;
p2:=b.s2*ni[a.s2] mod mo;
exit(p1*p2 mod mo);
end; function ask(l,r,x,y,z:longint):longint;
var m:longint;
p,q:int64;
begin
if z>=r then exit(get(tree[x],tree[y]))
else begin
m:=(l+r) shr ;
if z<=m then exit(ask(l,m,tree[x].l,tree[y].l,z))
else begin
p:=get(tree[tree[x].l],tree[tree[y].l]);
q:=ask(m+,r,tree[x].r,tree[y].r,z);
exit(p*q mod mo);
end;
end;
end; begin
for i:= to do
begin
if v[i]= then
begin
inc(t);
p[t]:=i;
v[i]:=i;
end;
for j:= to t do
begin
if i*p[j]> then break;
v[i*p[j]]:=p[j];
if i mod p[j]= then break;
end;
end;
ni[]:=;
for i:= to mo- do
begin
ni[i]:=-int64(mo div i)*ni[mo mod i] mod mo;
if ni[i]< then ni[i]:=(ni[i]+mo) mod mo;
end;
readln(n,m);
s[]:=;
sd[]:=;
for i:= to n do
begin
read(a[i]);
s[i]:=s[i-]*int64(a[i]) mod mo;
sd[i]:=sd[i-]*int64(ni[a[i]]) mod mo;
x:=a[i];
while x<> do
begin
inc(len);
y:=v[x];
e[len].po:=y;
e[len].num:=last[y];
e[len].next:=q[i];
q[i]:=len;
last[y]:=i;
while x mod y= do x:=x div y;
end;
end;
t:=;
tree[].s1:=;
tree[].s2:=;
h[]:=build(,n);
for i:= to n do
begin
h[i]:=h[i-];
j:=q[i];
while j<> do
begin
y:=e[j].po;
h[i]:=add(,n,h[i],e[j].num,y);
j:=e[j].next;
end;
end;
for i:= to m do
begin
readln(x,y);
x:=x xor ans;
y:=y xor ans;
if x>y then
begin
t:=x; x:=y; y:=t;
end;
wh:=ask(,n,h[x-],h[y],x-);
ans:=wh*s[y] mod mo*sd[x-] mod mo;
if ans< then ans:=(ans+mo) mod mo;
writeln(ans);
end;
end.
bzoj4026的更多相关文章
- 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- BZOJ4026: dC Loves Number Theory
Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所 ...
- [BZOJ4026]dC Loves Number Theory(线段树)
根据欧拉函数的定义式可知,可以先算出a[l]*a[l+1]*...*a[r]的值,然后枚举所有存在的质因子*(p-1)/p. 发现这里区间中一个质因子只要计算一次,所以指计算“上一个同色点在区间外”的 ...
- 【bzoj4026】dC Loves Number Theory 可持久化线段树
题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n ...
- [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树
链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...
- [bzoj4026]dC Loves Number Theory_主席树_质因数分解_欧拉函数
dC Loves Number Theory 题目大意:dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问 ...
- [暑假的bzoj刷水记录]
(这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊 堆一起算了 隔一段更新一下. 7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...
- [基本操作]线段树分治和动态dp
不知道为什么要把这两个没什么关系的算法放到一起写...可能是都很黑科技? 1.线段树分治 例题:bzoj4026 二分图 给你一个图,资瓷加一条边,删一条边,询问当前图是不是二分图 如果用 LCT 的 ...
随机推荐
- 理解 Memory barrier
理解 Memory barrier(内存屏障) 发布于 2014 年 04 月 21 日2014 年 05 月 15 日 作者 name5566 参考文献列表:http://en.wikipedia. ...
- 13test05:亲密数
/*#include<iostream> using namespace std; int main() {int sum[3000]={0}; for(int i=1;i<3000 ...
- 运行时修改TimerTask的执行周期
java.util.TimerTask类的执行周期period变量的声明如下: /** * Period in milliseconds for repeating tasks. A positive ...
- Javascript nextElementSibling和nextSibling
function next(ele) { if (typeof ele.nextElementSibling == 'object') { return ele.nextElementSibling; ...
- Ajax的进阶学习(二)
JSON和JSONP 如果在同一个域下,$.ajax()方法只要设置dataType属性即可加载JSON文件.而在非同域下,可以使用JSONP,但也是有条件的. Ajax进阶.html: <!D ...
- 更改cmd代码页,修正语言显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 rem 英文 chcp 437 rem 日文 chcp 932 rem 简体中文 chcp 936 re ...
- Android应用的核心基础
Android4开发入门经典 之 第二部分:Android应用的核心基础 Android应用中的组件 Application Components Android应用中最主要的组件是: 1:Activ ...
- TableViewCell自定义分割线
产品设计的要求cell的分割线长度不用是整个屏幕宽,并且设计要求分割线为2px(两条),上下不同色. 实现如下: UITableView中将分割线样式改为None tableView.separato ...
- linux 如何让程序后台执行
$ (./test.sh &) $ setsid ./test.sh & $ nohup ./test.sh & 具体的转自:http://digdeeply.or ...
- 【web性能】web性能测试工具推荐
WEB性能测试工具主要分为三种,一种是测试页面资源加载速度的,一种是测试页面加载完毕后页面呈现.JS操作速度的,还有一种是总体上对页面进行评价分析,下面分别对这些工具进行介绍,如果谁有更好的工具也请一 ...