思路:容易知道2和3是互质的,而gcd的话,就是出现次数最小的那个数值。
所以我们开两个数组差分后,一次前缀和,然后算出2出现的最小次数,3出现的最小次数。快速幂算一下相乘即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1E5+50;
ll a[N],b[N];
const ll mod=998244353;
ll qpow(ll a,ll b){
ll ans=1;
a%=mod;
while(b){
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main(){
int T;scanf("%d",&T);
while(T--){
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=n+1;i++) a[i]=b[i]=0;
for(int i=1;i<=m;i++){
int x,y,d;scanf("%d%d%d",&x,&y,&d);
if(d==2){
a[x]++,a[y+1]--;
}
else b[x]++,b[y+1]--;
}
ll mi1=1e18,mi2=1e18;
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
b[i]+=b[i-1];
mi1=min(mi1,a[i]);
mi2=min(mi2,b[i]);
}
printf("%lld\n",qpow(2,mi1)*qpow(3,mi2)%mod);
}
return 0;
}