提交时间:2022-07-19 11:52:00

运行 ID: 52301

#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]; struct data{ int num,lst,llst; }; int f(int l,int r) { int ret=0; if(l&1) { for(int i=l;i<=r;i+=2) if(i+1<=r) ret^=(s[i]+s[i+1]); if((r&1)) ret^=s[r]; } else { ret=s[l]; for(int i=l+1;i<=r;i+=2) if(i+1<=r) ret+=(s[i]^s[i+1]); if((r&1)) ret+=s[r]; } return ret; } int main() { // freopen("fold.in","r",stdin); // freopen("fold.out","w",stdout); scanf("%d",&k); s[1]=0,s[2]=(1<<k)-1; used[s[1]]=used[s[2]]=1; int tot=2; queue<data> q; q.push((data){(1<<k-1),0,0}); int 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]+1,r[now]+1))+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; }