AFO

牛客网NOIP赛前集训营-普及组(第七场)

链接:C
来源:牛客网

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


哇!这题可以乱搞!!!
然后我的乱搞就gg了TAT
然后正解也真的是乱搞,只是我搞丑了QAQ


显然最有用的是%,每次加完乘完后%一下下一个模数,至于最后一个模数后的数其实也没有什么用了
然后把1~100000暴力带进去试就行啦


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<cstring>
#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");
    }
}
posted @ 2019-10-12 16:00  ZUTTER☮  阅读(170)  评论(0编辑  收藏  举报