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. ES6标准入门 第五章:函数的扩展

    1.函数参数的默认值 (1)基本用法 ES5 中, 不能直接为函数的参数指定默认值.只能采用变通的方法. function log(x, y) { y = y || 'World'; console. ...

  2. LeetCode算法题-Goat Latin Easy(Java实现)

    这是悦乐书的第322次更新,第344篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第192题(顺位题号是824).给出句子S,由空格分隔的单词组成.每个单词仅由小写和大写 ...

  3. 求一个集合S中m个元素的所有排列以及一个数组A的全排列—递归实现版完整代码

    说明,本文全文代码均用dart语言实现. 求一个集合S中m个元素的所有排列情况,并打印,非常适合用递归的思路实现.本文给出了两种实现方法,一种是给定的填充排列数组长度是固定的,一种是可变长度的.两种方 ...

  4. tensorflow学习之tf.truncated_normal和tf.random_noraml的区别

    tf版本1.13.1,CPU 最近在tf里新学了一个函数,一查发现和tf.random_normal差不多,于是记录一下.. 1.首先是tf.truncated_normal函数 tf.truncat ...

  5. docker--docker 网络管理

    9 docker 网络管理 9.1 默认网络 1.查看docker网络: docker network ls Docker中默认的三种网络分别为bridge.host和none,其中名为bridge的 ...

  6. Git入门资料

    1.廖雪峰老师Git教程 地址:https://www.liaoxuefeng.com/wiki/896043488029600 2.Eclipse eGit连接GitHub教程 地址:https:/ ...

  7. 【官网】2019.5.19 CentOS8.0 最新进展

    Contents CentOS 8 Rough Status Page General Steps Architectures Main architectures AltArch Current T ...

  8. python 生成list的所有的子集 (不使用递归且不引入标准库)

    不使用递归且不引入标准库,单纯用两个for循环即可得出一个list的所有子集 L = [1, 2, 3, 4] List = [[]] for i in range(len(L)):          ...

  9. set(详解)

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

  10. RabbitMQ交换器Exchange介绍与实践

    RabbitMQ交换器Exchange介绍与实践 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器Exchang ...