~~30分我老有经验了~~
by Infinity_Fantasy @ 2023-10-10 20:55:23
@[vicky128](/user/177000)
你 不 会 同 余 系 吗
快去学 :D
我的同余系实现:
```cpp
const I mod=571373,N=1e5+10;
I n,q,tn;
struct mo{I x;mo(I a=0){x=a;if(x<0)x+=mod;if(x>=mod)x-=mod;}
mo operator +(const mo&a)const{return mo(x+a.x);}
mo operator -(const mo&a)const{return mo(x-a.x);}
mo operator *(const mo&a)const{return mo(1ll*x*a.x%mod);}
V operator *=(const mo&a){x=1ll*x*a.x%mod;}
V operator +=(const mo&a){x+=a.x;x%=mod;}
}a[N],su[N];
```
by SMT0x400 @ 2023-10-10 20:56:05
[评测记录(开ull,空间开四倍)](https://www.luogu.com.cn/record/128633936)
[评测记录(开ull,空间开两倍)](https://www.luogu.com.cn/record/128633235)
[评测记录(开LL,空间开两倍)](https://www.luogu.com.cn/record/128628671)
by vicky128 @ 2023-10-10 20:56:10
@[vicky128](/user/177000)
30分是因为你在push的时候加法的懒标记也要进行乘法操作
by Infinity_Fantasy @ 2023-10-10 20:56:25
@[SMT0x400](/user/121995) 看不懂你的代码%%%%%
by vicky128 @ 2023-10-10 20:56:46
@[vicky128](/user/177000) 就是你add也要乘mul
by Infinity_Fantasy @ 2023-10-10 20:57:24
@[AK_CCF](/user/571265) 乘了,在这一段里面
```cpp
void push(int no,int l,int r){
int ad=tr[no].add,mu=tr[no].mul,lc=tr[no].l,rc=tr[no].r,mi=l+r>>1;
tr[no].add=0,tr[no].mul=1;
if(mu>1){
......
tr[lc].add*=mu,tr[lc].add%=mod;
......
tr[rc].add*=mu,tr[rc].add%=mod;
......
}
if(ad)
......
}
```
by vicky128 @ 2023-10-10 20:58:12
@[vicky128](/user/177000) 这是我写的代码
```
tree[p<<1].addlazy=(tree[p<<1].addlazy*tree[p].mulazy%m+tree[p].addlazy)%m,
tree[p<<1|1].addlazy=(tree[p<<1|1].addlazy*tree[p].mulazy%m+tree[p].addlazy)%m;
```
by Infinity_Fantasy @ 2023-10-10 20:59:10
@[AK_CCF](/user/571265) 我个人觉得我push内部的加法实现出来和您的是一样的QAQ
by vicky128 @ 2023-10-10 21:00:14
@[vicky128](/user/177000) 其实不用写
```
if(mu>1) 和 if(ad)
```
因为你初始化的乘法标记是1,加法是0所以不用判直接操作即使没有也不影响答案
by Infinity_Fantasy @ 2023-10-10 21:00:54