[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, 博猪不知道为什么 ...
随机推荐
- 【leetcode 简单】第十一题 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...
- 旋转3D立方体
<!DOCTYPE html><html><head> <title>css-3d-盒子</title> <meta charset= ...
- HDU 2593 Pirates’ Code (STL容器)
题目链接 Problem Description Davy Jones has captured another ship and is smiling contently under the sun ...
- C - K-inversions URAL - 1523 (dp + 线段树)
题目链接:https://cn.vjudge.net/contest/275079#problem/C 具体思路:我们可以分层的去建立,假设我们要找k层,我们可以先把满足1.2....k-1层的满足情 ...
- PHP 快速建立一个对象
前言 PHP 中的数组(尤其关联数组)是经常使用的 —— 因为方便.在一些框架中也经常见到返回数组格式的配置参数.然而有些时候可能需要对象而非数组类型的配置参数,在查阅网络资料后找到了方法,作以记录. ...
- C++ Class与Struct的区别
转自某楼层的回复http://bbs.csdn.net/topics/280085643 首先,讨论这个问题应该仅从语法上讨论,如果讨论不同人之间编程风格上的差异,那这个问题是没有答案的.毕竟不同的人 ...
- 在ubuntu 上安装pycharm
1.首先在官网下载pycharm并进行提取,将提取的文件夹放在/usr下面(或者任意位置) 2.然后vi /etc/hosts 编辑 将0.0.0.0 account.jetbrains.com添加到 ...
- Tutorial 6: ViewSets & Routers
转载自:http://www.django-rest-framework.org/tutorial/6-viewsets-and-routers/ Tutorial 6: ViewSets & ...
- [ python ] 购物系统
作业需求 1. 购物系统,能够注册登录,用户第一次登录后,让用户输入金额,然后打印商品列表2. 允许用户根据商品编号购买商品3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒4. 购买完一 ...
- php判断是手机还是pc访问从而走不同url
<?php header("Content-type:text/html;charset=utf-8"); function is_mobile(){ $user_agent ...