题目链接: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; }