祖传 GCD
听说过祖传的染色体,有没有听说过祖传的GCD呢。
讲实话,我这道题,就比较简单,你就坐在此处慢慢读题。我去买几个橘子,你就好好写题,不要换题。
输入
输入一个正整数T,表示有T组实例(T<=10)
每组实例两个正整数n和m,表示数组的范围为n,数组的初始值为1;(1<n<100000)(1<m<1000)
紧接着是m行,每行输入三个数L,R,X,表示在数组从第L到第R个数内,每个a[i]乘以X;(1<x<4)
输出
每个实例,输出这n个数的GCD,占一行,结果对998244353取余
样例输入
2 5 3 1 3 2 3 5 2 1 5 3 6 3 1 2 2 5 6 2 1 6 2
样例输出
6 2
代码如下:
#include<stdio.h>
#include<string.h>
#define N 100000
#define mod 998244353
#define LL long long
int a[N],b[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int p=m;
while(p--)
{
int L,R,X;
scanf("%d%d%d",&L,&R,&X);
for(int i=L; i<=R; i++)
{
if(X==2)
a[i]++;
else if(X==3)
b[i]++;
}
}
int n1,n2;
n1=n2=m;
for(int i=1; i<=n; i++)
{
if(n1>a[i])
n1=a[i];
if(n2>b[i])
n2=b[i];
}
LL m1,m2;
m1=m2=1;
for(int i=1; i<=n1; i++)
{
m1*=2;
m1%=mod;
}
for(int i=1; i<=n2; i++)
{
m2*=3;
m2%=mod;
}
printf("%lld\n",(m1*m2)%mod);
}
return 0;
}