1. 程式人生 > 實用技巧 >hdu6273 Master of GCD---差分

hdu6273 Master of GCD---差分

題目連結: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\n",ans);
	}
	return 0;
}