题意: 解法: 对x=2和x=3分别开两个数组,记录每个点乘x的次数, 那么区间乘法操作就变成了区间加法操作, 由于只有一次查询,因此差分即可. gcd就是对x=2的数组取min得到mi2,对x=3的数组取min得到mi3, 那么ans=2^mi2 * 3^mi3. code: #include <bits/stdc++.h> using namespace std; #define int long long #define PI pair<int,int> const int maxm=2e6+5; const int mod=998244353; int a[maxm]; int b[maxm]; int c[maxm]; int n,m; int ppow(int a,int b,int mod){ int ans=1%mod;a%=mod; for(;b;b>>=1,a=a*a%mod)if(b&1)ans=ans*a%mod; return ans; } void solve(){ cin>>n>>m; for(int i=1;i<=n;i++)a[i]=b[i]=0; for(int ii=1;ii<=m;ii++){ int l,r,x;cin>>l>>r>>x; if(x==2){ a[l]++; a[r+1]--; }else{ b[l]++; b[r+1]--; } } for(int i=1;i<=n;i++)a[i]+=a[i-1]; for(int i=1;i<=n;i++)b[i]+=b[i-1]; int mi2=1e9,mi3=1e9; for(int i=1;i<=n;i++)mi2=min(mi2,a[i]); for(int i=1;i<=n;i++)mi3=min(mi3,b[i]); int ans=1; ans*=ppow(2,mi2,mod); ans%=mod; ans*=ppow(3,mi3,mod); ans%=mod; cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0); int T;cin>>T; while(T--){ solve(); } return 0; }