题目链接:https://vjudge.net/problem/HDU-6273#author=614984177
题意:一开始数列全为1,m次操作,每次把区间[l,r]内的数乘2或乘3,求最后所有数的最大公约数
17杭州ccpc的一道简单题。可以求出对于每个位置的数,乘了多少个2和3,这个可以令区间[l,r]全部+1得到,由于是最后询问gcd,所以可以用差分。最后统计2和3的最少因子数num2和num3,则2^num2*3^num3就是答案
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const int mod=998244353;
int d2[N],d3[N],c2[N],c3[N];
int t,n,m,i,j,k,num2,num3;
ll qpow(ll b,ll p){
ll res=1;
while (p){
if (p&1) res=res*b%mod;
b=b*b%mod;
p>>=1;
}
return res%mod;
}
int main(){
scanf("%d",&t);
while (t--){
memset(d2,0,sizeof(d2));
memset(d3,0,sizeof(d3));
c2[0]=c3[0]=0;
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++){
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
if (x==2){d2[l]++;d2[r+1]--;}
else {d3[l]++;d3[r+1]--;}
}
num2=num3=1e7;
for (i=1;i<=n;i++) {
c2[i]=c2[i-1]+d2[i]; c3[i]=c3[i-1]+d3[i];
num2=min(num2,c2[i]); num3=min(num3,c3[i]);
}
ll ans=qpow(2,num2)*qpow(3,num3)%mod;
printf("%lld
",ans);
}
return 0;
}