2019 ICPC上海網絡賽 H Luhhy's Matrix

#include<bits/stdc++.h>
#define N 16
#define INF 0x3f3f3f3f
#define eps 1e-6
#define pi 3.141592653589793
#define mod 1000000007
#define P 998244353
#define LL long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define bug(x) cerr<<#x<<"      :   "<<x<<endl
#define mem(x,y) memset(x,0,sizeof(int)*(y))
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;

struct Mat{
    bool d[N][N];
    Mat (){memset(this,0,sizeof(Mat));}
    Mat operator * (Mat &b) const{
        Mat c;
        for(int i=0;i<N;i++)
            for(int j=0;j<N;j++) if (d[i][j])
                for(int k=0;k<N;k++)
                c.d[i][k]^=b.d[j][k];
        return c;
    }
};

Mat q[50010];
int _17[N],_19[N];

int main(){
    _17[0]=_19[0]=1;
    for(int i=1;i<N;i++) _17[i]=_17[i-1]*17,_19[i]=_19[i-1]*19;
    Mat x,E;    for(int i=0;i<N;i++) E.d[i][i]=1;
    int T;
    scanf("%d",&T);
    while(T--){
        int t,n,head=1,tail=0,fg=0; unsigned int seed,ans=0;
        x=E;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {
            scanf("%d%u",&t,&seed);
            if (t==1){
                seed^=ans;
                Mat c;
                for(int i=0;i<N;i++){
                    seed^=seed*seed+15;
                    for(int j=0;j<N;j++) 
                        c.d[i][j]=(seed>>j)&1;
                }
                q[++tail]=c;
                x=c*x;
            }else if (head<=tail)head++;
                
            if (head>fg){
                fg=tail;
                x=E;
                for(int i=tail-1;i>=head;i--) q[i]=q[i+1]*q[i];
            }
            
            if (head>tail){
                puts("0"); ans=0; continue;
            }
            Mat tmp=x*q[head];
            ans=0;
            for(int i=0;i<N;i++)
                for(int j=0;j<N;j++) if (tmp.d[i][j])
                    ans+=_17[i]*_19[j];
            printf("%u\n",ans);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章