提交时间:2022-07-19 12:36:21

运行 ID: 52523

#include<cstdio> #include<algorithm> #include<queue> using namespace std; const int M=1e4+10; bool used[2000]; int k,m,l[2],r[2],a,b,c; int s[M],h[2]; int tp,n; struct data{ int num,lst,llst; }; int f(int l,int r) { int ret=0; if(l&1) { if(r&1) ret=s[l]+(r-l>>1)*tp; else ret=s[l]+s[r]+(r-l>>1)*tp; } else { if(r&1) ret=((r-l+1)>>1&1)?tp:0; else ret=((r-l)>>1&1)?s[r+1]:s[r]; } return ret; } int main() { // freopen("fold.in","r",stdin); // freopen("fold.out","w",stdout); scanf("%d",&k); s[0]=0,s[1]=(1<<k)-1; used[s[0]]=used[s[1]]=1; int tot=1; queue<data> q; q.push((data){(1<<k-1),0,0}); tp=(1<<k)-1,n=tp+1; while(!q.empty()) { data u=q.front(); q.pop(); if(used[u.num]||used[tp-u.num]) continue; s[++tot]=u.num; s[++tot]=tp-u.num; used[u.num]=used[tp-u.num]=1; if(u.lst>=u.num&&u.lst+(u.lst-u.num)<=tp&&!used[u.lst+(u.lst-u.num)]) q.push((data){u.lst+(u.lst-u.num),u.lst,u.llst}); if(u.num<=u.lst&&!used[(u.num+u.llst)>>1]) q.push((data){(u.num+u.llst)>>1,u.num,u.lst}); else if(u.num>u.lst&&!used[(u.num+u.lst)>>1]) q.push((data){(u.num+u.lst)>>1,u.num,u.lst}); } scanf("%d %d %d",&m,&l[0],&r[0]); scanf("%d %d %d",&a,&b,&c); int now=0; for(int i=0;i<m;i++) { h[now^1]=((l[now]^r[now]^h[now]^f(l[now],r[now]))+c)%1000000007; l[now^1]=((l[now]^a^h[now^1])%(n+1))%n; r[now^1]=((r[now]^b^h[now^1])%(n-l[now^1]))+l[now^1]; now^=1; } printf("%d\n",h[now]); // fclose(stdin); // fclose(stdout); return 0; }