提交时间:2023-08-09 12:09:15
运行 ID: 97108
#include<bits/stdc++.h> using namespace std; typedef long long ll; const ll mod=1000000007; ll k,m,h,l,r,p[32],n,a,b,c; ll A(ll x) { ll ans=0,q=x>>1; for(int i=0; i<k; i++) ans=(ans<<1)|(q&1),q>>=1; if(x&1) ans^=p[k]; return ans; } inline ll f(ll l,ll r,ll k) { if((l&1) && (r&1)) return A(l)+(r-l>>1)*p[k]; if((l&1) && (!(r&1))) return A(l)+A(r)+(r-l>>1)*p[k]; if((!(l&1)) && (r&1)) return (r-l+1>>1)&1?p[k]:0; return ((r-l>>1)&1?p[k]:0)^A(r); } int main() { // freopen("fold.in","r",stdin); // freopen("fold.out","w",stdout); scanf("%lld%lld%lld%lld%lld%lld%lld",&k,&m,&l,&r,&a,&b,&c); n=1<<k; p[0]=0; for(int i=1; i<=31; i++) p[i]=p[i-1]*2+1; for(int i=1; i<=m; i++) { h=((l^r^h^f(l,r,k))+c)%mod; l=((l^a^h)%(n+1))%n; r=((r^b^h)%(n-l))+l; } printf("%lld\n",h); return 0; }