[BZOJ5334][TJOI2018]数学计算(exgcd/线段树)
模意义下除法若结果仍为整数的话,可以记录模数的所有质因子,计算这些质因子的次幂数,剩余的exgcd解决。
$O(n\log n)$但有9的常数(1e9内的数最多有9个不同的质因子),T了。
- #include<cstdio>
- #include<algorithm>
- #define rep(i,l,r) for (int i=(l); i<=(r); i++)
- using namespace std;
- const int N=;
- int T,n,mod,op,w,tot,res,x,d[N][],p[],s[];
- void frac(int n){
- for (int i=; i*i<=n; i++) if (n%i==){
- p[++tot]=i;
- while (n%i==) n/=i;
- }
- if (n>) p[++tot]=n;
- }
- void exgcd(int a,int b,int &x,int &y){
- if (!b) x=,y=;
- else exgcd(b,a%b,y,x),y-=a/b*x;
- }
- int main(){
- freopen("bzoj5334.in","r",stdin);
- freopen("bzoj5334.out","w",stdout);
- for (scanf("%d",&T); T--; ){
- scanf("%d%d",&n,&mod); tot=; res=; frac(mod);
- rep(i,,) s[i]=;
- rep(i,,n){
- scanf("%d",&op);
- if (op==){
- scanf("%d",&w);
- rep(j,,tot) d[i][j]=;
- rep(j,,tot)
- while (w%p[j]==) w/=p[j],d[i][j]++,s[j]++;
- int x,y; res=1ll*res*w%mod;
- exgcd(w,mod,x,y); d[i][]=(x%mod+mod)%mod;
- int ans=res;
- rep(j,,tot) rep(k,,s[j]) ans=1ll*ans*p[j]%mod;
- printf("%d\n",ans);
- }else{
- scanf("%d",&x); res=1ll*res*d[x][]%mod;
- rep(j,,tot) s[j]-=d[x][j];
- int ans=res;
- rep(j,,tot) rep(k,,s[j]) ans=1ll*ans*p[j]%mod;
- printf("%d\n",ans);
- }
- }
- }
- return ;
- }
删除操作难以维护的话,考虑线段树分治即可。
- #include<cstdio>
- #include<algorithm>
- #define ls (x<<1)
- #define rs (ls|1)
- #define lson ls,L,mid
- #define rson rs,mid+1,R
- #define rep(i,l,r) for (int i=(l); i<=(r); i++)
- using namespace std;
- const int N=;
- int T,n,mod,x,op,tag[N<<];
- struct P{ int l,r,v; }p[N];
- void push(int x){
- tag[ls]=1ll*tag[ls]*tag[x]%mod;
- tag[rs]=1ll*tag[rs]*tag[x]%mod;
- tag[x]=;
- }
- void build(int x,int L,int R){
- tag[x]=;
- if (L==R) return;
- int mid=(L+R)>>;
- build(lson); build(rson);
- }
- void ins(int x,int L,int R,int l,int r,int k){
- if (L==l && r==R){ tag[x]=1ll*tag[x]*k%mod; return; }
- int mid=(L+R)>>;
- if (r<=mid) ins(lson,l,r,k);
- else if (l>mid) ins(rson,l,r,k);
- else ins(lson,l,mid,k),ins(rson,mid+,r,k);
- }
- int que(int x,int L,int R,int pos){
- if (L==R) return tag[x];
- int mid=(L+R)>>; push(x);
- if (pos<=mid) return que(lson,pos); else return que(rson,pos);
- }
- int main(){
- for (scanf("%d",&T); T--; ){
- scanf("%d%d",&n,&mod);
- rep(i,,n){
- scanf("%d",&op);
- if (op==) scanf("%d",&x),p[i]=(P){i,n,x};
- else scanf("%d",&x),p[x].r=i-,p[i].l=;
- }
- build(,,n);
- rep(i,,n) if (p[i].l) ins(,,n,p[i].l,p[i].r,p[i].v);
- rep(i,,n) printf("%d\n",que(,,n,i));
- }
- return ;
- }
[BZOJ5334][TJOI2018]数学计算(exgcd/线段树)的更多相关文章
- BZOJ5334 [TJOI2018] 数学计算 【线段树分治】
题目分析: 大概是考场上的签到题.首先mod不是质数,所以不能求逆元.注意到有加入操作和删除操作.一个很典型的想法就是线段树分治.建立时间线段树然后只更改有影响的节点,最后把所有标记下传.时间复杂度是 ...
- 【BZOJ5334】数学计算(线段树)
[BZOJ5334]数学计算(线段树) 题面 BZOJ 洛谷 题解 简单的线段树模板题??? 咕咕咕. #include<iostream> #include<cstdio> ...
- 洛谷P4588 [TJOI2018]数学计算 【线段树】
题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...
- P4588 [TJOI2018]数学计算 (线段树)
用线段树维护操作序列,叶子结点存要乘的数,非叶子结点存区间乘积,每次输出tr[1] 就是答案. 1 #include<bits/stdc++.h> 2 #define ll long lo ...
- BZOJ5334: [Tjoi2018]数学计算
BZOJ5334: [Tjoi2018]数学计算 https://lydsy.com/JudgeOnline/problem.php?id=5334 分析: 线段树按时间分治即可. 代码: #incl ...
- BZOJ 5334--[Tjoi2018]数学计算(线段树)
5334: [Tjoi2018]数学计算 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 220 Solved: 147[Submit][Status ...
- BZOJ5334:[TJOI2018]数学计算(线段树)
Description 小豆现在有一个数x,初始值为1. 小豆有Q次操作,操作有两种类型: 1 m: x = x * m ,输出 x%mod; 2 pos: x = x / 第pos次操作所乘 ...
- 2018.06.26「TJOI2018」数学计算(线段树)
描述 小豆现在有一个数 xxx ,初始值为 111 . 小豆有 QQQ 次操作,操作有两种类型: 111 $ m$ : x=x×mx=x×mx=x×m ,输出 xxx modmodmod MMM : ...
- [Tjoi2018]数学计算
[Tjoi2018]数学计算 BZOJ luogu 线段树分治 是不是想问为什么不暴力做? 模数没说是质数,所以不一定有逆元. 然后就是要每次build一下把线段树权值init成1, 博猪不知道为什么 ...
随机推荐
- 持续集成工具Jenkins安装、部署、使用
本文介绍jenkins,利用其做项目发布与持续集成交付工具. 一.Jenkins是什么? Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布 ...
- CodeForces - 1004B
Sonya decided to organize an exhibition of flowers. Since the girl likes only roses and lilies, she ...
- HDU 1999 不可摸数 (模拟)
题目链接 Problem Description s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何数m,s(m)都不等于n,则称n为不可摸数 ...
- centos6.5 导入matplotlib报错 No module named '_tkinter
1.解决方案 在centos系统下,导入matplotlib时,出现ImportError: No module named ‘_tkinter’的错误,首先 yum list installed | ...
- PHP提取url
<?php $str = parse_url('http://localhost/?id=2&cd=2', PHP_URL_QUERY); ECHO $str; parse_str($s ...
- 76.ZYNQ-用PS控制DDR3内存读写
本编文章的目的主要用简明的方法对DDR3进行读写,当然这种方式每次读写都需要CPU干预,效率是比较低的,但是这是学习的过程吧. 本系列文章尽可能的让每一个实验都相对独立,过程尽可能保证完整性,保证实验 ...
- Keras自定义评估函数
1. 比较一般的自定义函数: 需要注意的是,不能像sklearn那样直接定义,因为这里的y_true和y_pred是张量,不是numpy数组.示例如下: from keras import backe ...
- openjudge-NOI 2.6-1944 吃糖果
题目链接:http://noi.openjudge.cn/ch0206/1944/ 题解: 递推,题目中给出了很详细的过程,不讲解 #include<cstdio> int n; int ...
- C/C++——C语言常用库函数
本文转载自:https://blog.csdn.net/qq_36955347/article/details/71511900 一.数学函数 调用数学函数时,要求在源文件中包下以下命令行: #inc ...
- JavaScript 去字符串空格
JavaScript 去字符串空格 (利用正则) # str为要去除空格的字符串: # 去除所有空格: str = str.replace(/\s+/g,""); # 去除两头空格 ...