题面

传送门

思路

这题目是真的难读......阅读理解题啊......

但是理解了以后就发现,题目等价于:

给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993取模

这里是欧拉函数的原因显然,题目中的那个不相冲实际上就是扩展欧几里得里面的那个定理,要满足不相冲(也就是方程有解),$product$和$number$必须互质

序列当中,每个元素大小不超过1e6,质因数都是前60个

那么我们显然可以开一棵线段树来维护这个区间乘积,但是怎么处理欧拉函数呢?$O(\sqrt{n})$的复杂度求吗?但是这题可以到$1000000^{100000}$诶......

没关系,我们来看一个神秘小技巧

设一个数$x=\prod_{i=1}{k}p_i{a_i}$,那么:

$\varphi(x)=\prod_{i=1}{k}(p_i-1)p_i{a_i-1}=x\prod_{i=1}^{k}\frac{p_i-1}{p_i}$

那么我们再开一棵线段树,把60个质因数在对应区间里的出现情况压进一个long long里面

每次查询的时候,查询出来取模过的乘积,再对每个出现过的质因数乘上模意义下的$\frac{p_i-1}{p_i}$,就是答案了

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#define ll long long
#define mp make_pair
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
const ll MOD=19961993;
ll qpow(ll a,ll b){
ll re=1ll;
while(b){
if(b&1) re=re*a%MOD;
a=a*a%MOD;b>>=1;
}
return re;
}
int vis[310],pri[70],cntp,inv[70];
void init(){
int i,j,k;vis[1]=1;
for(i=2;i<=281;i++){
if(!vis[i]) pri[++cntp]=i,inv[cntp]=qpow(i,MOD-2);
for(j=1;j<=cntp;j++){
k=i*pri[j];if(k>281) break;
vis[k]=1;
if(i%pri[j]==0) break;
}
}
}
ll a[400010],bit[400010];//a是乘积,b是压位的质因数状态
void update(int num){
int son=num<<1;
a[num]=a[son]*a[son+1]%MOD;
bit[num]=bit[son]|bit[son+1];
}
void build(int l,int r,int num){
int mid=(l+r)>>1;
if(l==r){
a[num]=3;bit[num]=2;return;
}
build(l,mid,num<<1);build(mid+1,r,(num<<1)+1);
update(num);
}
void change(int l,int r,int num,int pos,ll val){
int mid=(l+r)>>1,i;
if(l==r){
a[num]=val;bit[num]=0;
for(i=1;i<=60;i++) if(val%pri[i]==0) bit[num]|=(1ll<<(i-1));
return;
}
if(mid>=pos) change(l,mid,num<<1,pos,val);
else change(mid+1,r,(num<<1)+1,pos,val);
update(num);
}
pair<ll,ll> query(int l,int r,int ql,int qr,int num){
int mid=(l+r)>>1;pair<ll,ll>re=mp(1,0),tmp;
if(l>=ql&&r<=qr) return mp(a[num],bit[num]);
if(mid>=ql){
tmp=query(l,mid,ql,qr,num<<1);
re.first=re.first*tmp.first%MOD;
re.second|=tmp.second;
}
if(mid<qr){
tmp=query(mid+1,r,ql,qr,(num<<1)+1);
re.first=re.first*tmp.first%MOD;
re.second|=tmp.second;
}
return re;
}
int main(){
int n=read(),i,t1,t2,t3;build(1,100000,1);pair<ll,ll>tmp;
init();
while(n--){
t1=read();t2=read();t3=read();
if(t1) change(1,100000,1,t2,t3);
else{
tmp=query(1,100000,t2,t3,1);
for(i=1;i<=60;i++)
if(tmp.second&(1ll<<(i-1)))
tmp.first=tmp.first*(pri[i]-1)%MOD*inv[i]%MOD;
printf("%lld\n",tmp.first);
}
}
}

[bzoj3813] 奇数国 [线段树+欧拉函数]的更多相关文章

  1. 【BZOJ3813】奇数国 线段树+欧拉函数

    [BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...

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

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

  3. 【bzoj3813】: 奇数国 数论-线段树-欧拉函数

    [bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...

  4. [BZOJ3813] 奇数国 - 线段树

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

  5. Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)

    题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...

  6. 线段树+欧拉函数——cf1114F

    调了半天,写线段树老是写炸 /* 两个操作 1.区间乘法 2.区间乘积询问欧拉函数 欧拉函数计算公式 phi(mul(ai))=mul(ai) * (p1-1)/p1 * (p2-1)/p2 * .. ...

  7. Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)

    这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...

  8. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

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

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

随机推荐

  1. iOS 多线程 之 GCD(大中枢派发)(二)

    本文接着上一篇讲.主要讲:dispatch_source. dispatch_source主要用户监听事件,可以监听如下事件 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATC ...

  2. HTML5一些标签和属性

    <bdo> 元素 可以覆盖默认文本的方向  根据dir 属性来控制文字的排序方向            属性:dir="rtl"                     ...

  3. IDEA的使用方法(一)(IDEA基本快捷键)

    一个软件的快捷键显得尤为重要,接下来来讲讲快捷键 CTR+N 搜索类 CTR+SHIT+N 搜索文件 CTR+ALT+空格 代码提示(类似于 ALT+/) ALT+F7 查询在某处使用 CTR+Q 查 ...

  4. kangle环境liunx一键安装脚本

    1.kangle官方脚本 linux下easypanel版本安装及升级(集成了kangle web 服务器和mysql,仅支持centos 5和centos 6)执行下面的命令即可,安装程序将自动安装 ...

  5. 转-Spark编程指南

    Spark 编程指南 概述 Spark 依赖 初始化 Spark 使用 Shell 弹性分布式数据集 (RDDs) 并行集合 外部 Datasets(数据集) RDD 操作 基础 传递 Functio ...

  6. POJ:2367-Cleaning Shifts

    传送门:http://poj.org/problem?id=2376 Cleaning Shifts Time Limit: 1000MS Memory Limit: 65536K Total Sub ...

  7. urllib使用一

    urllib.urlopen()方法: 参数: 1.url(要访问的网页链接http:或者是本地文件file:) 2.data(如果有,就会由GET方法变为POST方法,提交的数据格式必须是appli ...

  8. 7,vim

    vim与程序员 所有的 Unix Like 系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在. 但是目前我们使用比较多的是 vim 编辑器. vim 具有程序编辑的能力,可以主动的以字体 ...

  9. Windows系统安装测试redis

    因本人电脑是windows系统,从https://github.com/ServiceStack/redis-windows下载了兼容windows系统的redis 下载后直接解压到D:\redis目 ...

  10. BP神经网络的手写数字识别

    BP神经网络的手写数字识别 ANN 人工神经网络算法在实践中往往给人难以琢磨的印象,有句老话叫“出来混总是要还的”,大概是由于具有很强的非线性模拟和处理能力,因此作为代价上帝让它“黑盒”化了.作为一种 ...