题意分析:
初始数组中的数都为1,每次选一个区间[l, r], 使该区间中的数乘2或3, 最后求所有数的最大公约数。
解题思路:
因为2和3最大公约数为1, 所以如果要求所有数的最大公约数,那么就是所有数都乘的一个数,也就是说,如果他们的最大公约数是2,那么所有的数都一定乘过2.
记录所有数乘2和乘3的最小次数,答案为pow(2, min2)* pow(3, min3)% MOD
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define N 100020
const int MOD = 998244353;
using namespace std;
int a[N], b[N];
long long pow_(long long a, int b)
{
long long c=1;
while(b) {
if(b%2==1)
c=(c*a)%MOD;
b/=2;
a=(a*a)%MOD;
}
return c;
}
int main()
{
int T, n, m, l ,r, v, mina, minb;
scanf("%d", &T);
while(T--)
{
scanf("%d%d", &n, &m);
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
while(m--) {
scanf("%d%d%d", &l, &r, &v);
if (v==2) {
a[l]++;
a[r+1]--;
}
else {
b[l]++;
b[r+1]--;
}
}
mina=a[1];
minb=b[1];
for (int i=2; i<=n; i++) {
a[i]+=a[i-1];
b[i]+=b[i-1];
mina = min(mina, a[i]);
minb = min(minb, b[i]);
}
printf("%lld
", (1ll*pow_(2, mina) * pow_(3, minb)) % MOD);
}
return 0;
}
/*
2
5 3
1 3 2
3 5 2
1 5 3
6 3
1 2 2
5 6 2
1 6 2
*/