题目大意:给出初始值为X=1,Q个操作及m,每个操作给出2个数(a,b),第一个数表示操作类型,若操作类型a为1,表示X乘上b,若操作类型a为2,表示X除以第b个操作的操作数,对每个操作输出X%m,保证当操作类型a为2时,第b个操作的操作类型一定为1
解题思路:一开始想到模拟,该乘的时候乘,该除的时候除,每次都取余,但是一直WA,原因在于对于每次除操作,在取余之后再除以操作数,结果有误,所以应该将其转换为乘操作每次取余
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
__int64 a[maxn];
int flag[maxn],b[maxn];
int main()
{
int t,q;
__int64 m;
int cas = 1;
scanf("%d",&t);
while(t--)
{
scanf("%d%I64d",&q,&m);
__int64 result = 1;
printf("Case #%d:\n",cas++);
memset(flag,0,sizeof(flag));
for(int i = 1; i <= q; i++)
{
scanf("%d%I64d",&b[i],&a[i]);
if(b[i] == 1)
result = result*a[i]%m;
else if(b[i] == 2)
{
flag[a[i]] = 1;
result = 1;
for(int j = 1; j < i; j++)
{
if(b[j]==1&&!flag[j])
result = result*a[j]%m;
}
}
printf("%I64d\n",result);
}
}
return 0;
}