BZOJ 4026 dC Loves Number Theory (主席树+数论+欧拉函数)
题目大意:给你一个序列,求出指定区间的(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 (主席树+数论+欧拉函数)的更多相关文章
- bzoj 4026 dC Loves Number Theory 主席树+欧拉函数
题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源.给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n)代 ...
- bzoj 4026 dC Loves Number Theory
把我写吐了 太弱了 首先按照欧拉函数性质 我只需要统计区间不同质数个数就好了 一眼主席树 其次我被卡了分解质因数这里 可以通过质数筛时就建边解决 不够灵性啊,不知道如何改 #include<bi ...
- BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学
Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...
- [bzoj4026]dC Loves Number Theory_主席树_质因数分解_欧拉函数
dC Loves Number Theory 题目大意: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 分解质因数+主席树
[BZOJ4026]dC Loves Number Theory Description dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给 ...
- 【bzoj4026】dC Loves Number Theory 可持久化线段树
题目描述 dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯竭的水题资源. 给定一个长度为 n的正整数序列A,有q次询问,每次询问一段区间内所有元素乘积的φ(φ(n ...
- [BZOJ4026]dC Loves Number Theory 欧拉函数+线段树
链接 题意:给定长度为 \(n\) 的序列 A,每次求区间 \([l,r]\) 的乘积的欧拉函数 题解 考虑离线怎么搞,将询问按右端点排序,然后按顺序扫这个序列 对于每个 \(A_i\) ,枚举它的质 ...
- bzoj 2818 GCD 数论 欧拉函数
bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...
随机推荐
- [SCOI2016]萌萌哒(倍增+并查集)
当区间\([a,b]\)和\([c,d]\)对应相等时. 我们把两个区间对应位置上的数所在并查集合并. 最后并查集的数量为\(num\)答案就是\(9*10^num\)因为是个数,不能有前置\(0\) ...
- RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】
http://blog.csdn.net/deadgrape/article/details/50574459 接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动 ...
- ❝ Windows系统的FTP上传下载脚本 ❞
运行环境:windows 脚本功能:从目标系统下载数据库备份文件*.dmp 执行方法:windows任务计划定时调用文件ftp.bat 文件1:ftp.bat echo 开始备份日期: >> ...
- Elasticsearch 7.0 正式发布,盘他!
Elastic{ON}北京分享了Elasticsearch7.0在Speed,Scale,Relevance等方面的很多新特性. 比快更快,有传说中的那么牛逼吗?盘他! 通过本文,你能了解到: Ela ...
- BA-Delta知识点
问题: DSM-RTR的网络负载能力是怎样的?每条总线带32个模块吗?MS/TP总线上的模块需要拨地址码吗?最大可以承载多少个点? 答:理论值是30,最佳性能是21个,一般情况25-28个 linkn ...
- [SharePoint2010开发入门经典]10、使用SPS2010构建面向服务的应用程序
本章概要: 1.使用SPS自带的web service 2.构建自定义web service 3.使用不同的客户端解决方案部署自定义站点
- C++异常与析构函数及构造函数
析构函数不要抛出异常. 构造函数可以抛出异常,但是要谨慎. 原因下面这篇文章讲的不错,转载如下: http://jarfield.iteye.com/blog/811703 写Java代码的时候,遇到 ...
- ACM-SG函数之Fibonacci again and again——hdu1848
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- .NET 图片解密为BASE64
#region 图片加密 /// <summary> /// 加密本地文件 /// </summary> /// <param name="inputname& ...
- 淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划
淘宝数据库OceanBase SQL编译器部分 源代码阅读--生成逻辑计划 SQL编译解析三部曲分为:构建语法树.生成逻辑计划.指定物理运行计划. 第一步骤,在我的上一篇博客淘宝数据库OceanBas ...