题目大意:给你一个序列,求出指定区间的(l<=i<=r) mod 1000777 的值

还复习了欧拉函数以及线性筛逆元

考虑欧拉函数的的性质,(l<=i<=r),等价于 (p[j]是区间内所有出现过的质数)

那么考虑找出区间内所有出现过的质数,这思路和HH的项链是不是很像??

由于此题强制在线,所以把树状数组替换成了主席树而已

原来我以前写的主席树一直都是错的......还好推出了我原来错误代码的反例

在继承上一个树的信息时,注意不要破坏现在的树

 #include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define il inline
#define N 50010
#define maxn 1000000
#define mod 1000777
using namespace std; int n,q,ctp,tot;
int root[N];
int pr[maxn+],use[maxn+],lst[maxn+];
ll a[N],inv[mod+],nxt[maxn+];
struct Seg{ll sum;int ls,rs;}seg[N*]; //re
void prime_inv()
{
for(int i=;i<=maxn;i++)
{
if(!use[i])
pr[++ctp]=i,nxt[i]=i;
for(int j=;j<=ctp&&i*pr[j]<=maxn;j++){
use[i*pr[j]]=,nxt[i*pr[j]]=pr[j];
if(i%pr[j]==) break;
}
}
inv[]=inv[]=;
for(ll i=;i<mod;i++)
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
ll gc()
{
ll ret=,fh=;char p=getchar();
while(p<''||p>'') {if(p=='-')fh=-;p=getchar();}
while(p>=''&&p<='') {ret=(ret<<)+(ret<<)+p-'';p=getchar();}
return ret*fh;
}
il void pushup(int rt){seg[rt].sum=(seg[seg[rt].ls].sum*seg[seg[rt].rs].sum)%mod;}
void build(int l,int r,int rt)
{
seg[rt].sum=;
if(l==r)return;
int mid=(l+r)>>;
seg[rt].ls=++tot,build(l,mid,tot);
seg[rt].rs=++tot,build(mid+,r,tot);
}
void update(int x,int l,int r,int rt1,int rt2,ll w)
{
if(l==r) {seg[rt2].sum=(seg[rt2].sum*w)%mod;return;}
int mid=(l+r)>>;
if(x<=mid)
{
if(!seg[rt2].ls||seg[rt1].ls==seg[rt2].ls){
seg[rt2].ls=++tot,seg[seg[rt2].ls].sum=seg[seg[rt1].ls].sum;
if(!seg[rt2].rs)
seg[rt2].rs=seg[rt1].rs;
}
update(x,l,mid,seg[rt1].ls,seg[rt2].ls,w);
}else{
if(!seg[rt2].rs||seg[rt1].rs==seg[rt2].rs){
seg[rt2].rs=++tot,seg[seg[rt2].rs].sum=seg[seg[rt1].rs].sum;
if(!seg[rt2].ls)
seg[rt2].ls=seg[rt1].ls;
}
update(x,mid+,r,seg[rt1].rs,seg[rt2].rs,w);
}
pushup(rt2);
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return seg[rt].sum;
int mid=(l+r)>>;ll ans=;
if(L<=mid) ans*=query(L,R,l,mid,seg[rt].ls),ans%=mod;
if(R>mid) ans*=query(L,R,mid+,r,seg[rt].rs),ans%=mod;
return ans;
} int main()
{
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=;i<=n;i++) a[i]=gc();
prime_inv();
root[]=++tot;
build(,n,);
ll x,p,w;
for(int i=;i<=n;i++)
{
x=a[i],w=a[i],root[i]=++tot;
while(x!=){
p=nxt[x];
if(lst[p])
update(lst[p],,n,root[i-],root[i],(inv[p-]*p)%mod);
lst[p]=i;
x/=p,w=((w*(p-(ll))%mod)*inv[p])%mod;
while(x%p==) x/=p;
}
update(i,,n,root[i-],root[i],w);
}
ll l,r,ans=;
for(int i=;i<=q;i++)
{
l=gc(),r=gc();
l^=ans,r^=ans;
ans=query(l,r,,n,root[r]);
printf("%lld\n",ans);
}
return ;
}

BZOJ 4026 dC Loves Number Theory (主席树+数论+欧拉函数)的更多相关文章

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

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

  2. bzoj 4026 dC Loves Number Theory

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

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

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

  4. [bzoj4026]dC Loves Number Theory_主席树_质因数分解_欧拉函数

    dC Loves Number Theory 题目大意:dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问 ...

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

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

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

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

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

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

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

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

  9. bzoj 2818 GCD 数论 欧拉函数

    bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...

随机推荐

  1. vue 动态添加路由 require.context()

    之前的写法 'use strict' import Vue from 'vue' import MessageBroadcast from 'page/MessageBroadcast' import ...

  2. 关于linux系统的sendmail使用中的问题与解决

    系统环境是ubuntu16.04 安装 sudo apt-get install sendmail 检查运行情况 sudo service sendmail status 结果如下,表示正在运行 ● ...

  3. ARP(地址解析协议)

    目录 1. ARP 概述 2. ARP 协议工作原理 3. ARP 缓存 4. ARP 报文格式 5. 抓包分析 5.1. ARP 请求报文 5.2. ARP 应答报文 6. 免费 ARP 7. AR ...

  4. HDU1850 Being a Good Boy in Spring Festival

    /* HDU1850 Being a Good Boy in Spring Festival http://acm.hdu.edu.cn/showproblem.php?pid=1850 博弈论 尼姆 ...

  5. ie固定table单元格宽度

    <table border="0" style="width:690px; table-layout:fixed;"> <tr> < ...

  6. linux 下 The valid characters are defined in RFC 7230 and RFC 3986

    换tomcat 8.0.38就ok . 下载地址: http://archive.apache.org/dist/tomcat/tomcat-8/v8.0.38/bin/apache-tomcat-8 ...

  7. SDUT 1225-编辑距离(串型dp)

    编辑距离 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 如果字符串的基本操作仅为:删除一个字符.插入一个字符和将一个字符改动 ...

  8. Android 获取屏幕截图 和保存到本地的sd卡路径下

    /** * 获取和保存当前屏幕的截图 */ private void GetandSaveCurrentImage() { //1.构建Bitmap WindowManager windowManag ...

  9. 朴素贝叶斯python实现

    概率论是非常多机器学习算法基础,朴素贝叶斯分类器之所以称为朴素,是由于整个形式化过程中仅仅做最原始.简单的如果. (这个如果:问题中有非常多特征,我们简单如果一个个特征是独立的.该如果称做条件独立性, ...

  10. Android监听程序自身被卸载

    概述: 假设不是一些特殊的情况,我想大家非常少会接触到这个需求.事实上Android的Java部分没有提供对应的接口.这里须要去调用C的代码,也就是说要写JNI了.关于JNI的初识.大家能够去參考我博 ...