链接:C

来源:牛客网

牛牛的同学给牛牛表演了一个读心术:牛牛先任意选定一个非负整数,然后进行N次操作:每次操作前,假设牛牛当前的数是a,那么这个操作可能是a = a + x, 或者a = a * x, 或者a = a % x。N轮操作结束后,牛牛的同学成功猜出了牛牛最终的结果。牛牛觉得十分神奇,他现在把N个操作记录了下来,希望你帮忙验证一下这个读心术是不是一定会成功(既无论牛牛最开始选定的是什么数,最终的结果都是一样的)。

哇!这题可以乱搞!!!

然后我的乱搞就gg了TAT

然后正解也真的是乱搞,只是我搞丑了QAQ

显然最有用的是%,每次加完乘完后%一下下一个模数,至于最后一个模数后的数其实也没有什么用了

然后把1~100000暴力带进去试就行啦

#include

#include

#include

#include

#include

#define M 10000007

#define ULL unsigned long long

#define max(a,b) ((a)>(b)? (a):(b))

#define min(a,b) ((a)<(b)? (a):(b))

using namespace std;

ULL i,m,n,j,k,a[1000001][2],t,ans,b,c[100001], pre;

int main()

{

srand(time(0));

cin>>t;

for(;t;t--)

{

cin>>n;

pre=0;

for(i=1;i<=n;i++) cin>>a[i][0]>>a[i][1];

for(i=n;i>=1;i--)

{

if(a[i][0]==2) pre=a[i][1];

if(!pre) n--;

else c[i]=pre;

}

for(i=0,b=1;i<=10;i++)

{

ULL k=i;

for(j=1;j<=n;j++)

{

if(a[j][0]==0) k=k+a[j][1]%c[j];

if(a[j][0]==1) k=k*a[j][1]%c[j];

if(a[j][0]==2) k=k%a[j][1];

}

if(i==0) ans=k;

else if(ans!=k)

{

b=0;

break;

}

}

if(!b)

{

printf("NO\n");

continue;

}

for(i=0,b=1;i<=1000;i++)

{

ULL k=rand();

for(j=1;j<=n;j++)

{

if(a[j][0]==0) k=(k+a[j][1])%c[j];

if(a[j][0]==1) k=(k*a[j][1])%c[j];

if(a[j][0]==2) k=(k%a[j][1]);

}

if(ans!=k)

{

b=0;

break;

}

}

if(!b) printf("NO\n");

else printf("YES\n");

}

}