求卡常
查看原帖
求卡常
621902
yswn楼主2024/1/23 16:22

洛谷 10pts

#include<bits/stdc++.h>
using namespace std;
const int MAX=3110;
#define qm(x) (x+4)&3
#define ll long long
int n,q,a[MAX][MAX],op,x,y,x2,y2,d,dd,D,ans;
const int mod=1e9+7,mod1=998244353;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^'0');c=getchar();}
	return x;
}

int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
struct node{
    int it[4];ll vd[4];int xd[4];
}e[MAX*MAX];
struct V{
    int I;ll val;int d;
} v1,v2;
inline void find(V&,int,int);
inline void link(V,V,int,int,int,int);
inline void run(V&,int);
inline void put(){
    find(v1,0,1);
    for(int i=1;i<=n;++i){
        run(v1,2);
        v2=v1;v2.val%=mod;
        for(int j=1;j<=n;++j){
            // cout<<i<<" "<<j<<" "<<v2.I<<" "<<v2.val<<endl;
            // cout<<v2.d<<endl;
            run(v2,1);v2.val%=mod;
        }
    }

}
signed main(){ 
    // freopen("matrix.in","r",stdin);
    // freopen("matrix.out","w",stdout);
    
    n=read();q=read();
    for(int i=1;i<=n;++i)
        for(int j=1,p=i+1;j<=n;++j){
            a[i][j]=p;p=1ll*p*(i+1)%mod1;
        }
    for(int i=0,p=1;i<=n+1;++i)
        for(int j=0;j<=n+1;++j){
            for(int k=0;k<4;++k){
                int x=i+dx[k],y=j+dy[k],P=p+dx[k]*(n+2)+dy[k];
                if(x>n+1||x<0||y>n+1||y<0){
                    e[p].vd[k]=a[i][j];continue;
                }  
                e[p].it[k]=P;e[p].vd[k]=a[i][j]-a[x][y];
            }++p;
        }
    while(q--){
        // cout<<"q="<<q<<endl;
        op=read();x=read();y=read();x2=read();y2=read();
        if(op==1){
            dd=x2-x+1;find(v1,x-1,y);find(v2,x,y2);

            for(int i=1;i<=dd;++i){
                link(v1,v2,0,1,2,1);
                run(v1,1);if(i^dd)run(v2,2);
            } 
            
            run(v1,2);//run(v2,0);
            for(int i=1;i<=dd;++i){
                link(v1,v2,0,1,3,2);
                run(v1,2);if(i^dd)run(v2,3);
            }run(v1,3);//run(v2,1);
            for(int i=1;i<=dd;++i){
                link(v1,v2,0,1,0,3);
                run(v1,3);if(i^dd)run(v2,0);
            }
                run(v1,0);//run(v2,2);
            for(int i=1;i<=dd;++i){
                // cout<<v1.I<<" "<<v2.I<<endl;
                link(v1,v2,0,1,1,0);
                run(v1,0);run(v2,1);
            }
        }else{
            D=read();find(v1,x-1,y);find(v2,x,y);
            for(int i=1;i<=y2-y+1;++i){
                link(v1,v2,D,0,2,0);
                run(v1,1);run(v2,1);
            } run(v1,2);run(v2,3);
            for(int i=1;i<=x2-x+1;++i){
                link(v1,v2,D,0,3,1);
                run(v1,2);run(v2,2);
            }run(v1,3);run(v2,0);
            for(int i=1;i<=y2-y+1;++i){
                link(v1,v2,D,0,0,2);
                run(v1,3);run(v2,3);
            }run(v1,0);run(v2,1);
            for(int i=1;i<=x2-x+1;++i){
                link(v1,v2,D,0,1,3);
                run(v1,0);run(v2,0);
            }
        }
        put();
        // cout<<e[11].xd[1]<<endl;
    }
    find(v1,0,1);
    for(int i=1,p=12345;i<=n;++i){
        run(v1,2);
        v2=v1;v2.val%=mod;
        for(int j=1;j<=n;++j){
            ans=(ans+v2.val*p%mod)%mod;p=1ll*p*12345%mod;
            run(v2,1);v2.val%=mod;
        }
    }
    printf("%d",(ans+mod)%mod);
    /**/
}
inline void find(V &v,int x,int y){
    v={1,0,0};
    for(int i=1;i<=x;++i)  run(v,2);
    for(int i=1;i<=y;++i)  run(v,1);
}inline void link(V x,V y,int d1,int d2,int z,int Z1){//x的z方向是y
    int X=x.I,Y=y.I;int op=qm(z+x.d);
    e[X].it[op]=Y;e[X].vd[op]=x.val-d1-y.val;e[X].xd[op]=qm(x.d-y.d-d2);
    // cout<<X<<" "<<op<<" "<<e[X].xd[op]<<endl;
    op=qm(Z1+y.d);
    e[Y].it[op]=X;e[Y].vd[op]=y.val+d1-x.val;e[Y].xd[op]=qm(y.d-x.d+d2);
}inline void run(V &v,int z){
    int op=qm(z+v.d);
    v.val-=e[v.I].vd[op];v.d=qm(v.d-e[v.I].xd[op]);
    v.I=e[v.I].it[op];
}
/**/
2024/1/23 16:22
加载中...