生活随笔
收集整理的這篇文章主要介紹了
                                
Master of GCD(差分数组||线段树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            
 題意:長度為n的數組,一開始都是1.對于區間操作l,r,x,在l~r上乘以x。x2||x3。問操作完畢之后,n個數的最大公因子是多少。
 對于每個x,都等于2或者是3。那么看最大的公因子,就看各個位置上最少的2,最少的3的個數。然后乘起來就好了。線段樹區間更新,區間查詢。差分數組也可以做。
 線段樹做法:
 
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std
;const int maxx
=1e5+100;
struct node
{int l
;int r
;ll sum2
;ll sum3
;ll lazy2
;ll lazy3
;
}p
[maxx
<<2];
int n
,m
;inline ll 
qsm(ll a
,ll b
)
{ll ans
=1;while(b
){if(b
&1) ans
=(ans
*a
)%mod
;a
=(a
*a
)%mod
;b
>>=1;}return ans
;
}
inline void pushup(int cur
)
{p
[cur
].sum2
=min(p
[cur
<<1].sum2
,p
[cur
<<1|1].sum2
);p
[cur
].sum3
=min(p
[cur
<<1].sum3
,p
[cur
<<1|1].sum3
);
}
inline void pushdown(int cur
)
{if(p
[cur
].lazy2
){p
[cur
<<1].sum2
=(p
[cur
].lazy2
+p
[cur
<<1].sum2
)%mod
;p
[cur
<<1].lazy2
=(p
[cur
<<1].lazy2
+p
[cur
].lazy2
)%mod
;p
[cur
<<1|1].sum2
=(p
[cur
<<1|1].sum2
+p
[cur
].lazy2
)%mod
;p
[cur
<<1|1].lazy2
=(p
[cur
<<1|1].lazy2
+p
[cur
].lazy2
)%mod
;p
[cur
].lazy2
=0;}if(p
[cur
].lazy3
){p
[cur
<<1].sum3
=(p
[cur
].lazy3
+p
[cur
<<1].sum3
)%mod
;p
[cur
<<1].lazy3
=(p
[cur
<<1].lazy3
+p
[cur
].lazy3
)%mod
;p
[cur
<<1|1].sum3
=(p
[cur
<<1|1].sum3
+p
[cur
].lazy3
)%mod
;p
[cur
<<1|1].lazy3
=(p
[cur
<<1|1].lazy3
+p
[cur
].lazy3
)%mod
;p
[cur
].lazy3
=0;}
}
inline void build(int l
,int r
,int cur
)
{p
[cur
].l
=l
;p
[cur
].r
=r
;p
[cur
].lazy2
=0;p
[cur
].lazy3
=0;p
[cur
].sum2
=0;p
[cur
].sum3
=0;if(l
==r
) return ;int mid
=l
+r
>>1;build(l
,mid
,cur
<<1);build(mid
+1,r
,cur
<<1|1);
}
inline void update(int l
,int r
,int v
,int cur
)
{int L
=p
[cur
].l
;int R
=p
[cur
].r
;if(l
<=L
&&R
<=r
){if(v
==2) p
[cur
].sum2
++,p
[cur
].lazy2
++;if(v
==3) p
[cur
].sum3
++,p
[cur
].lazy3
++;p
[cur
].sum2
%=mod
,p
[cur
].lazy2
%=mod
;p
[cur
].sum3
%=mod
,p
[cur
].lazy3
%=mod
;return ;}pushdown(cur
);int mid
=L
+R
>>1;if(r
<=mid
) update(l
,r
,v
,cur
<<1);else if(l
>mid
) update(l
,r
,v
,cur
<<1|1);else update(l
,mid
,v
,cur
<<1),update(mid
+1,r
,v
,cur
<<1|1);pushup(cur
);
}
int main()
{int l
,r
,x
;int t
;scanf("%d",&t
);while(t
--){scanf("%d%d",&n
,&m
);build(1,n
,1);for(int i
=1;i
<=m
;i
++){scanf("%d%d%d",&l
,&r
,&x
);update(l
,r
,x
,1);}ll ans1
=qsm(2ll,(ll
)p
[1].sum2
)%mod
;ll ans2
=qsm(3ll,(ll
)p
[1].sum3
)%mod
;printf("%lld\n",(ans2
*ans1
)%mod
);}return 0;
}
 
努力加油a啊,(o)/~
                            總結
                            
                                以上是生活随笔為你收集整理的Master of GCD(差分数组||线段树)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。