1 条题解

  • 0
    @ 2026-5-10 23:56:53

    输入恶心,细节恶心,代码清爽。

    一堆全局操作,考虑用两个全局变量 xxyy 表示 ai=xai+ya_i=x\cdot a_i+y,再用 vv 表示全局推平的值。这时候,操作一就可以转换成 xai+y=valx\cdot a_i+y=val,则 ai=valyxa_i=\frac{val-y}{x},用逆元做并存在哈希表里即可。

    操作二即为 y=y+valy=y+val

    操作三为 x=xvalx=x\cdot valy=yvaly=y\cdot val

    操作四为 v=valv=val,同时清空哈希表,并令 x=1x=1y=0y=0

    操作五分类,如果不在哈希表为 vx+yv\cdot x+y,否则为哈希表内的值 aix+ya_i\cdot x+y

    操作六,数组内的所有数应该都是 aix+ya_i\cdot x+y 的形式,累加的结果应该是 aix+yn\sum a_i\cdot x+y\cdot n。用 ss 表示哈希表内的和,cntcnt表示哈希表内数的个数,则 ans=x((ncnt)v+s)+nyans=x\cdot((n-cnt)\cdot v+s)+n\cdot y

    细节:逆元会出现 0,要特判。

    #include<bits/stdc++.h>
    #define int long long
    #define mod 10000019
    using namespace std;
    int qpow(int a,int b){
    	int s=1;
    	for(;b;b>>=1){
    		if(b&1)s=s*a%mod;
    		a=a*a%mod;
    	}
    	return s;
    }
    unordered_map<int,int>pd;
    int n,q,t,a[100010],b[100010],c[100010],ans,x=1,y,v,s,cnt;
    void solve(int k){
    	if(a[k]==1){
    		if(!pd[b[k]])cnt++;
    		s-=pd[b[k]],pd[b[k]]=(c[k]-y+mod)%mod*qpow(x,mod-2)%mod,s+=pd[b[k]];
    	}
    	if(a[k]==2)y=(y+b[k])%mod;
    	if(a[k]==3)x=(x*b[k])%mod,y=(y*b[k])%mod;
    	if(a[k]==4)v=b[k]%mod,x=1,y=0,cnt=0,s=0,pd.clear();
    	if(a[k]==5){
    		if(pd[b[k]])ans=(ans+pd[b[k]]*x%mod+y)%mod;
    		else ans=(ans+v*x%mod+y)%mod;
    	}
    	if(a[k]==6)ans=(ans+(v*(n-cnt)%mod+s)*x%mod+y*n%mod)%mod;
    }
    signed main()
    {
    	ios::sync_with_stdio(0);
    	cin>>n>>q;
    	for(int i=1;i<=q;i++){
    		cin>>a[i];
    		if(a[i]!=6)cin>>b[i];
    		if(a[i]==1)cin>>c[i],c[i]=(c[i]%mod+mod)%mod;
    		else b[i]=(b[i]%mod+mod)%mod;
    		if(a[i]==3&&b[i]==0)a[i]=4;
    	}
    	cin>>t;
    	for(int i=1;i<=t;i++){
    		int x,y;
    		cin>>x>>y;
    		for(int j=1;j<=q;j++)solve((x+j*y)%q+1);
    	}
    	cout<<ans;
    }
    
    • 1

    信息

    ID
    2379
    时间
    2000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    13
    已通过
    8
    上传者