[TJOI2018] matemáticas
título Descripción
Hay una serie de adzuki x, Q tiene un valor inicial de 1. Las operaciones de adzuki, hay dos tipos de operaciones:
1 m: x = x × m salida x% mod;
2 Pos: x = x / número de veces de pos operación multiplicado (operaciones de punto de venta deben asegurarse de que el primer tipo 1, tipo 1 para la operación de cada otro será como máximo una vez) de salida x% mod;
Formato de entrada
Hay un conjunto de entrada t (t≤5);
Para cada conjunto de entrada, la primera línea es dos números Q, mod (Q≤100000, mod≤100000000);
Siguiente líneas Q, cada op comportamiento tipo de operación, el número de operación o el número se multiplica m (para asegurar que todas las entradas son válidas).
Formato de salida
Para cada operación, la fila de salida contiene el valor x% operación mod realiza después de
A primera vista pensé que era un título de simulación de ruta, una mirada más cercana se encuentra que longlong ráfaga, entonces pensé que era un problema de matemáticas;
De hecho, se puede llevar a cabo su árbol segmento, línea de árboles línea de productos intervalo de mantenimiento, cuando pos = 2, un solo punto de la modificación de la línea;
En muchos casos como este, el pensamiento es más importante que el algoritmo;
código:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100100;
const int M=2000100;
LL mod,m;
struct Node{
int l,r;
LL w;
}tr[N*4];
void build(int l,int r,int k){
tr[k].l=l,tr[k].r=r;
if(l==r){
tr[k].w=1;
return;
}
int d=(l+r)>>1;
build(l,d,ls);
build(d+1,r,rs);
(tr[k].w=tr[ls].w*tr[rs].w)%=mod;
}
void update(int pos,LL val,int k){
if(tr[k].l==tr[k].r){
tr[k].w=val;
return;
}
int d=(tr[k].l+tr[k].r)>>1;
if(pos<=d) update(pos,val,ls);
else update(pos,val,rs);
(tr[k].w=tr[ls].w*tr[rs].w)%=mod;
}
int main(){
int t;
cin>>t;
while(t--){
int q;
cin>>q>>mod;
build(1,q,1);
for(int i=1;i<=q;i++){
int op;
scanf("%d%lld",&op,&m);
if(op==1){
update(i,m,1);
printf("%lld\n",tr[1].w);
}
else{
update(m,1,1);
printf("%lld\n",tr[1].w);
}
}
}
return 0;
}