LGP4588

LGP4588

十一月 17, 2021

LGP4588

Analysis

​ 最开始拿到这一道题目的时候第一个反应是暴力求解问题。遇见除法的时候就直接乘上逆元来取模

​ 但是$\exist x, ax\equiv1(mod\ n)\iff gcd(a,n)=1$

对于每一组输入,第一行是两个数字 Q,M

​ 这个M是输入给的,不保证上面的条件。

​ 这个时候就要转换思路了

我们考虑高精度直接硬算

​ 两个操作每次就只修改一个数(单点修改)。

​ 同余的性质:两个数相乘再去模等于两个数分别取模再相乘再取模(可以左右两边的结果合并)

​ 所以说可以考虑用线段树进行操作,选择以时间为轴(能想出来这种方法的真是神仙),这棵线段树应当有$n$个叶子节点,初始值为$1$,假如第$i$次操作是$1$操作,将第$i$个节点转换成为$m$,假如是$2$操作,将$pos$位置改成$1$,每次输出根节点的值就好了

Codes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include<iostream>
#include<cstdio>
#include<stack>
#include<queue>
#include<deque>
#include<vector>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<bitset>
#include<set>
#include<cmath>
using namespace std;

#define rint register int
#define Int64 long long
#define max(x,y) (((x)>(y))?(x):(y))
#define min(x,y) (((x)<(y))?(x):(y))
#define clr(x,y) memset(x,y,sizeof(x))
#define sqar(x) (x)*(x)
#define lowbit(x) (x&(-x))
#define swp(x,y) x^=y,y^=x,x^=y
#define Maxn 100005

class Segment_tree{
private:
Int64 databank[Maxn<<2];
Int64 Mod;

public:
void SetMod(int M){Mod=M;}

void pushup(int nowpos){
databank[nowpos]=(databank[nowpos<<1]*databank[nowpos<<1|1])%Mod;
}

void init(int nowpos,int L,int R){
if(L==R){databank[nowpos]=1;return;}
int mid=L+R>>1;
init(nowpos<<1,L,mid);
init(nowpos<<1|1,mid+1,R);
pushup(nowpos);
}

void modify(int nowpos,int L,int R,int pur,int val){
if(L==R&&L==pur){
databank[nowpos]=val;
return;
}
int mid=L+R>>1;
if(pur<=mid)modify(nowpos<<1,L,mid,pur,val);
if(pur>mid)modify(nowpos<<1|1,mid+1,R,pur,val);
pushup(nowpos);
}

void output(){cout<<databank[1]<<endl;}
}S;

inline void read(int &x){
x=0;char c=getchar();while(c<'0'||c>'9'){c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
}

int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
int t;read(t);
while(t--){
int q,m;read(q);read(m);
S.SetMod(m);
S.init(1,1,q);
for(int i=1;i<=q;i++){
int op,v;read(op);read(v);
if(op==1)S.modify(1,1,q,i,v),S.output();
else{
S.modify(1,1,q,v,1);
S.output();
}
}
}
return 0;
}