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;
}

 

posted @ 2020-09-18 16:54  coastal_taipan  阅读(203)  评论(0编辑  收藏  举报