Code:

#include <bits/stdc++.h>
#define ll long long
#define maxn 50207
#define setIO(s) freopen(s".in","r",stdin)
#define mod 1000777
using namespace std;
struct Tree
{
int tot;
int lson[maxn*270],rson[maxn*270];
ll mul[maxn*270];
int ins(int x,int l,int r,int p,ll v)
{
int o=++tot;
lson[o]=lson[x],rson[o]=rson[x];
if(x) mul[o]=mul[x]*v%mod;
else mul[o]=v;
if(l==r) return o;
int mid=(l+r)>>1;
if(p<=mid) lson[o]=ins(lson[x],l,mid,p,v);
else rson[o]=ins(rson[x],mid+1,r,p,v);
return o;
}
ll query(int x,int l,int r,int L,int R)
{
if(l>=L&&r<=R) return mul[x];
ll re=1;
int mid=(l+r)>>1;
if(L<=mid) re=re*query(lson[x],l,mid,L,R)%mod;
if(R>mid) re=re*query(rson[x],mid+1,r,L,R)%mod;
return re;
}
}tr;
int cnt,n,m;
int prime[1000004],vis[1000004],pre[1000006],rt[maxn],cur[maxn];
ll arr[maxn],mul[maxn];
ll qpow(ll base,ll k)
{
ll re=1;
while(k)
{
if(k&1) re=re*base%mod;
base=base*base%mod;
k>>=1;
}
return re;
}
void Initialize(int N)
{
for(int i=2;i<=N;++i)
{
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&1ll*prime[j]*i<=N;++j)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(int i=1;i<=n;++i)
{
int x=arr[i],cc=0;
rt[i]=rt[i-1];
if(x==1)
{
rt[i]=tr.ins(rt[i-1],1,n,i,1);
continue;
}
cur[++cc]=rt[i];
for(int j=1;j<=cnt&&1ll*prime[j]*prime[j]<=x;++j)
{
if(x%prime[j]==0)
{
if(pre[prime[j]])
{
cur[cc+1]=tr.ins(cur[cc],1,n,pre[prime[j]],1ll*prime[j]*qpow((prime[j]-1), mod-2)%mod);
++cc;
}
cur[cc+1]=tr.ins(cur[cc],1,n,pre[prime[j]]=i,1ll*(prime[j]-1)*qpow(prime[j],mod-2)%mod);
++cc;
while(x%prime[j]==0) x/=prime[j];
}
}
if(x>1)
{
if(pre[x])
{
cur[cc+1]=tr.ins(cur[cc],1,n,pre[x],1ll*x*qpow((x-1), mod-2)%mod);
++cc;
}
cur[cc+1]=tr.ins(cur[cc],1,n,pre[x]=i,1ll*(x-1)*qpow(x,mod-2)%mod);
++cc;
}
rt[i]=cur[cc];
for(int i=1;i<=cc;++i) cur[i]=0;
}
}
int main()
{
// setIO("input");
scanf("%d%d",&n,&m);
int mx=0;
mul[0]=1;
for(int i=1;i<=n;++i)
{
scanf("%lld",&arr[i]);
mul[i]=mul[i-1]*arr[i]%mod;
mx=max(mx, (int)arr[i]);
}
Initialize(mx);
ll lastans=0;
for(int i=1;i<=m;++i)
{
// lastans=0;
int l,r;
scanf("%d%d",&l,&r);
l^=lastans,r^=lastans;
ll rev=qpow(mul[l-1],mod-2);
lastans=mul[r]*rev%mod*tr.query(rt[r],1,n,l,r)%mod;
printf("%lld\n",lastans);
}
return 0;
}

  

BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学的更多相关文章

  1. 【bzoj4026】dC Loves Number Theory 可持久化线段树

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

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

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

  3. bzoj 4026 dC Loves Number Theory

    把我写吐了 太弱了 首先按照欧拉函数性质 我只需要统计区间不同质数个数就好了 一眼主席树 其次我被卡了分解质因数这里 可以通过质数筛时就建边解决 不够灵性啊,不知道如何改 #include<bi ...

  4. BZOJ 4026 dC Loves Number Theory (主席树+数论+欧拉函数)

    题目大意:给你一个序列,求出指定区间的(l<=i<=r) mod 1000777 的值 还复习了欧拉函数以及线性筛逆元 考虑欧拉函数的的性质,(l<=i<=r),等价于 (p[ ...

  5. 【BZOJ4026】dC Loves Number Theory 分解质因数+主席树

    [BZOJ4026]dC Loves Number Theory Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.    给 ...

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

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

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

    BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...

  8. [BZOJ4026]dC Loves Number Theory(线段树)

    根据欧拉函数的定义式可知,可以先算出a[l]*a[l+1]*...*a[r]的值,然后枚举所有存在的质因子*(p-1)/p. 发现这里区间中一个质因子只要计算一次,所以指计算“上一个同色点在区间外”的 ...

  9. [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树

    链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...

随机推荐

  1. JavaScript对象之--- RegExp

    1.概述 正则表达式是描述字符模式的对象. 正则表达式用于对字符串模式匹配以及检索替换: 2.语法 前者为模式,后者为修饰符. var reg = new RegExp( "xyz" ...

  2. Centos快速安装 Memcached

    rpm qa|grep memcached //首先检查memcache是否已经安装完成 yum install memcached //(提示你是否确认安装输入y)检查完成后执行安装命令 yum i ...

  3. 基于html5二个div 连线

    因为要实现拖拽连线研究了一下基于extjs 和html5的不同实现方法 extjs底层的画图引擎是svg 不知道在html5大潮即将袭来的前夕一贯走在技术前沿的extjs开发团队没有自己封装基于htm ...

  4. TensorFlow2.0矩阵与向量的加减乘

    1.矩阵加法使用 a = np.random.random((3,3))b = np.random.randint(0,9,(3,3)) ad = tf.add(a,b) 2.矩阵乘法注意 # ten ...

  5. mangde 的服务启动

    启动命令如下

  6. jupyter与requests的初步使用

    upyter 是一个简易的,方便的写Python代码的工具包,requests是Python里非常好用的用来发送 http 请求的包. 开始学习本教程之前,请确保你已经安装了Python,并且安装了P ...

  7. 计算机系统结构总结_Instruction Set Architecture

    Textbook:<计算机组成与设计——硬件/软件接口>  HI<计算机体系结构——量化研究方法>          QR 这节我们来看CPU内部的一些东西. Instruct ...

  8. 通过修改host解决VS2019下载极慢的问题

    原文:通过修改host解决VS2019下载极慢的问题 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  9. 在webpack中配置.vue组件页面的解析

    1. 运行`cnpm i vue -S`将vue安装为运行依赖: 2. 运行`cnpm i vue-loader vue-template-compiler -D`将解析转换vue的包安装为开发依赖: ...

  10. ThinkPHP无法打开或点击不了Trace的问题

    首先先确认是否打开了Trace配置项,ThinkPHP3.*为'SHOW_PAGE_TRACE'=>true,ThinkPHP5.*为'app_trace'=>true. 如果已经确认开启 ...