1 条题解
-
0
输入恶心,细节恶心,代码清爽。
一堆全局操作,考虑用两个全局变量 和 表示 ,再用 表示全局推平的值。这时候,操作一就可以转换成 ,则 ,用逆元做并存在哈希表里即可。
操作二即为 。
操作三为 ,。
操作四为 ,同时清空哈希表,并令 ,。
操作五分类,如果不在哈希表为 ,否则为哈希表内的值 。
操作六,数组内的所有数应该都是 的形式,累加的结果应该是 。用 表示哈希表内的和,表示哈希表内数的个数,则 。
细节:逆元会出现 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
- 上传者