2017中国大学生程序设计竞赛-杭州站 : Master of GCD(差分)

 

 

题意分析:

初始数组中的数都为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\n", (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
*/

 

posted @ 2019-08-17 15:08  宿星  阅读(115)  评论(0编辑  收藏  举报